web-dev-qa-db-ja.com

Pythonで実際のファイルを作成せずに一時ファイル名を生成する

Stackoverflowの質問 number 10501247 は、Pythonで一時ファイルを作成する方法の答えを提供します。
私の場合、一時ファイル名のみが必要です。
tempfile.NamedTemporaryFile()を呼び出すと、実際のファイル作成後にファイルハンドルが返されます。
ファイル名のみを取得する方法はありますか?

# Trying to get temp file path
tf = tempfile.NamedTemporaryFile()
temp_file_name = tf.name
tf.close()
# Here is my real purpose to get the temp_file_name
f = gzip.open(temp_file_name ,'wb')
...
68
Hill

一時ファイル名のみが必要な場合は、内部tempfile関数_get_candidate_names()を呼び出すことができます。

import tempfile

temp_name = next(tempfile._get_candidate_names())
% e.g. px9cp65s

nextを再度呼び出すと、別の名前などが返されます。これにより、一時フォルダーへのパスが得られません。デフォルトの「tmp」ディレクトリを取得するには、次を使用します。

defult_tmp_dir = tempfile._get_default_tempdir()
% results in: /tmp 
54
Marcin

これを行う最も簡単で最も安全な方法は次のようなものだと思います:

path = os.path.join(tempfile.mkdtemp(), 'something')

ユーザーだけがアクセスできる一時ディレクトリが作成されるため、セキュリティ上の問題はありませんが、ファイルは作成されないため、そのディレクトリに作成するファイル名を選択できます。

29
Alec

少し遅いかもしれませんが、これに何か問題はありますか?

import tempfile
with tempfile.NamedTemporaryFile(dir='/tmp', delete=False) as tmpfile:
    temp_file_name = tmpfile.name
f = gzip.open(temp_file_name ,'wb')
12
russell

tempfile.mktemp() これを行います。

ただし、廃止されていることに注意してください。ただし、notはファイルを作成し、_get_candidate_names()を使用する場合と比較して、tempfileのパブリック関数になります。

廃止される理由は、これを呼び出してから実際にファイルを作成しようとするまでの時間のギャップが原因です。しかし、私の場合、その可能性は非常に低く、たとえそれが失敗したとしても、それは受け入れられるでしょう。しかし、ユースケースを評価するのはあなた次第です。

7
Zitrax

Joachim Isakssonがコメントで述べたように、名前を取得しただけでは、プログラムが実行する前に他のプログラムがその名前を使用すると問題が発生する可能性があります。チャンスはわずかですが、不可能ではありません。

そのため、この状況で安全なことは、署名GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])を持つ完全なGzipFile()コンストラクターを使用することです。必要に応じて、開いているfileobjとファイル名を渡すことができます。詳細については、gzipドキュメントを参照してください。

4
PM 2Ring

以前の回答を組み合わせて、私の解決策は次のとおりです。

def get_tempfile_name(some_id):
    return os.path.join(tempfile.gettempdir(), next(tempfile._get_candidate_names()) + "_" + some_id)

some_id不要な場合はオプション。

4
juanmirocks