2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Windows環境:`NamedTemporaryFile`で作成したファイルを再度openすると、`PermissionError`が発生する

Last updated at Posted at 2023-03-28

環境

  • Python3.11.2
  • Xubntu 22.04
  • Windows11 Pro 22H2

やりたいこと

tempfileモジュールを使って一時ファイルを作成したいです。

sample.py
import tempfile
    

def write_hello_file(file_path:str) -> None:
    print(f"{file_path=}")
    with open(file_path, mode="w") as f:
        f.write("hello")

        
with tempfile.NamedTemporaryFile() as f:
    write_hello_file(f.name)

$ python sample.py
file_path='/tmp/tmp83qptmm7'

起きたこと

Windowsで実行すると、PermissionErrorが発生しました。


PS > python sample.py
file_path='C:\\Users\\admin\\AppData\\Local\\Temp\\tmpnlbu7s17'
Traceback (most recent call last):
  File "C:\Users\admin\Documents\study\20230328\sample.py", line 11, in <module>
    write_hello_file(f.name)
  File "C:\Users\admin\Documents\study\20230328\sample.py", line 6, in write_hello_file
    with open(file_path, mode="w") as f:
         ^^^^^^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\admin\\AppData\\Local\\Temp\\tmpnlbu7s17'

何が原因か

NamedTemporaryFileで作成したファイルを2回openしたときの動きは、プラットフォームによって異なるからです。

Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows).

どのように解決したか

TemporaryDirectoryで一時ディレクトリを作って、そのディレクトリに一時ファイルを作成しました。

with tempfile.TemporaryDirectory() as str_temp_dir:
    write_hello_file(f"{str_temp_dir}/temp.txt")

PS > python sample.py
file_path='C:\\Users\\admin\\AppData\\Local\\Temp\\tmp9qgjr91l/temp.txt'

以下のサイトのように、NamedTemporaryFile(delete=False)を指定して自分で一時ファイルを削除する方法もあります。
ただし、この方法だと一時ファイルを削除し忘れる恐れがあるので、採用しませんでした。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?