128

Python では、ランダムなテキストを生成して、サーバーに保存するファイル (名前) の前に追加する良い方法、または最良の方法は何ですか? ありがとうございました!

4

13 に答える 13

162

UUID モジュールを使用して、ランダムな文字列を生成できます。

import uuid
filename = str(uuid.uuid4())

UUIDジェネレーターが重複する識別子 (この場合はファイル名) を生成する可能性が非常に低いことを考えると、これは有効な選択です。

次の 100 年間、毎秒 10 億個の UUID を生成した後で初めて、複製が 1 つだけ作成される確率は約 50% になります。地球上のすべての人が 6 億の UUID を所有している場合、1 つの重複の確率は約 50% になります。

于 2012-05-08T15:09:10.610 に答える
135

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'

一時ファイルを操作するための追加の例は、ここにあります

于 2012-05-08T15:04:18.530 に答える
24

一般的なアプローチは、タイムスタンプをプレフィックス/サフィックスとしてファイル名に追加して、ファイルとの時間的な関係を持たせることです。さらに一意性が必要な場合は、これにランダムな文字列を追加できます。

import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'
于 2012-05-08T15:18:58.717 に答える
10

OP は、ランダムファイルではなく、ランダムファイル名の作成を要求しました。時間と UUID は衝突する可能性があります。単一のマシン (共有ファイルシステムではない) で作業していて、プロセス/スレッドがそれ自体を踏みにじらない場合は、 を使用して独自の PID を取得し、これを一意のファイル名の要素として使用します。他のプロセスは明らかに同じ PID を取得しません。マルチスレッドの場合は、スレッド ID を取得します。単一のスレッドまたはプロセスが複数の異なる一時ファイルを生成する可能性があるコードの他の側面がある場合は、別の手法を使用する必要がある場合があります。ローリング インデックスは機能します (インデックスをそれほど長く保持していない場合や、ロールオーバーを心配するほど多くのファイルを使用していない場合)。その場合、「アクティブな」ファイルへのグローバルハッシュ/インデックスを保持するだけで十分です。os.getpid()

長々とした説明で申し訳ありませんが、正確な使用法に依存します。

于 2015-04-22T16:48:23.627 に答える
10

ファイル パスが不要で、事前定義された長さのランダムな文字列のみが必要な場合は、次のようなものを使用できます。

>>> import random
>>> import string

>>> file_name = ''.join(random.choice(string.ascii_lowercase) for i in range(16))
>>> file_name
'ytrvmyhkaxlfaugx'
于 2017-06-04T18:05:27.203 に答える
9

元のファイル名を新しいファイル名の一部として保持したい場合は、現在の時間の 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
于 2012-05-08T18:52:35.887 に答える