回答:
Pythonには一時ファイル名を生成する機能があります。http://docs.python.org/library/tempfile.htmlを参照してください。例えば:
In [4]: import tempfile
を呼び出すたびにtempfile.NamedTemporaryFile()
異なる一時ファイルが生成され、その名前には次のような.name
属性でアクセスできます。
In [5]: tf = tempfile.NamedTemporaryFile()
In [6]: tf.name
Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i'
In [7]: tf = tempfile.NamedTemporaryFile()
In [8]: tf.name
Out[8]: 'c:\\blabla\\locals~1\\temp\\tmpr8vvme'
一意のファイル名を取得すると、通常のファイルと同じように使用できます。注:デフォルトでは、ファイルを閉じると削除されます。ただし、delete
パラメーターがFalseの場合、ファイルは自動的に削除されません。
完全なパラメータセット:
tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
一時ファイルの接頭辞を指定することもできます(ファイルの作成時に指定できるさまざまなパラメーターの1つとして)。
In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'
一時ファイルを操作するための追加の例はここにあります
ランダムな文字列を生成するためにUUIDモジュールを使用できます:
import uuid
filename = str(uuid.uuid4())
UUIDジェネレーターが重複した識別子(この場合はファイル名)を生成する可能性が非常に低いことを考えると、これは有効な選択です。
次の100年間、毎秒10億個のUUIDを生成して初めて、複製が1つだけ作成される確率は約50%になります。地球上のすべての人が6億のUUIDを所有している場合、1つの重複の確率は約50%になります。
uuid.uuid4().hex
、ダッシュなしの16進文字列を取得するために使用します(-
)。
一般的なアプローチは、ファイル名にプレフィックス/サフィックスとしてタイムスタンプを追加して、ファイルとの一時的な関係を持たせることです。さらに一意性が必要な場合でも、ランダムな文字列を追加できます。
import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'
1. Test if file exists, 2. create file.
。別のプロセスがステップ1と2の間に割り込み、ファイルを作成した場合、コードが再開すると、他のプロセスのファイルが上書きされます。
tempfile
、これを処理するモジュールを使用できます。:)
...strftime("%y%m%d_%H%M%S%f")
OPは、ランダムファイルではなくランダムファイル名を作成するように要求しました。時間とUUIDが衝突する可能性があります。単一のマシン(共有ファイルシステムではない)で作業していて、プロセス/スレッドがそれ自体で踏みつけない場合は、os.getpid()を使用して独自のPIDを取得し、これを一意のファイル名の要素として使用します。他のプロセスは明らかに同じPIDを取得しません。マルチスレッドの場合は、スレッドIDを取得します。単一のスレッドまたはプロセスが複数の異なる一時ファイルを生成する可能性があるコードの他の側面がある場合は、別の手法を使用する必要がある場合があります。ローリングインデックスは機能します(あまり長く保持しない場合、または非常に多くのファイルを使用する場合は、ロールオーバーが心配になります)。その場合、「アクティブ」ファイルへのグローバルハッシュ/インデックスを保持するだけで十分です。
長い説明で申し訳ありませんが、実際の使用方法によって異なります。
元のファイル名を新しいファイル名の一部として保持したい場合は、現在の時刻のMD5ハッシュを使用して、長さが一定の一意のプレフィックスを生成できます。
from hashlib import md5
from time import localtime
def add_prefix(filename):
prefix = md5(str(localtime()).encode('utf-8')).hexdigest()
return f"{prefix}_{filename}"
add_prefix( 'style.css')を呼び出すと、次のようなシーケンスが生成されます。
a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css
私は個人的に自分のテキストをランダム/一意であるだけでなく美しいものにすることを好みます。そのため、私はhashids libが好きです。これは、整数から見栄えの良いランダムテキストを生成します。を通じてインストールできます
pip install hashids
スニペット:
import hashids
hashids = hashids.Hashids(salt="this is my salt", )
print hashids.encode(1, 2, 3)
>>> laHquq
簡単な説明:
Hashidsは小さなオープンソースライブラリで、数字から短くて一意の非連続IDを生成します。
あなたはランダムなパッケージを使うことができます:
import random
file = random.random()