web-dev-qa-db-ja.com

Pythonでランダムなファイル名を生成する最良の方法

Pythonでは、それが上書きされないことを確認するために、サーバーに保存しているファイル(名前)の前にランダムなテキストを生成するための良い、または最良の方法です。ありがとうございました!

84
zallarak

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'
_

一意のファイル名を取得したら、通常のファイルと同様に使用できます。 :デフォルトでは、ファイルは閉じられるとdeletedになります。ただし、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'
_

一時ファイルを操作するための追加の例を見つけることができます here

96
Levon

ランダム文字列を生成するために IDモジュール を使用できます。

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

[〜#〜] uuid [〜#〜] ジェネレーターが重複した識別子(この場合はファイル名)を生成する可能性は非常に低いため、これは有効な選択です。

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

87
Óscar López

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

import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'
14
moooeeeep

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

>>> import random
>>> import string

>>> file_name = ''.join(random.choice(string.ascii_lowercase) for i in range(16))
>>> file_name
'ytrvmyhkaxlfaugx'
7
4xy

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

長い説明に申し訳ありませんが、実際の使用方法によって異なります。

7
Brad

元のファイル名を新しいファイル名の一部として保持する場合は、次の方法で一意の長さの一意のプレフィックスを生成できます。

def add_prefix(filename):

  from hashlib import md5
  from time import localtime

  return "%s_%s" % (md5(str(localtime())).hexdigest(), filename)

Àdd_prefix( 'style.css')を呼び出すと、次のようなシーケンスが生成されます。

a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css
5
Aleš Kotnik

ここに私の2セントを追加します。

In [19]: tempfile.mkstemp('.png', 'bingo', '/tmp')[1]
Out[19]: '/tmp/bingoy6s3_k.png'

Tempfile.mkstempのpython docによれば、可能な限り最も安全な方法で一時ファイルを作成します。この呼び出しの後にファイルが存在することに注意してください。

In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1])
Out[20]: True
1
shahins
>>> import random
>>> import string    
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'

「string.ascii_letters」を任意の文字列形式に変更して、モバイルNO、ID ...などの他のテキストを生成できます。 enter image description here

0
Freman Zhang

私は個人的にテキストをランダム/ユニークなだけでなく美しいものにすることを好むので、整数から素敵なランダムなテキストを生成するhashids libが好きです。を通じてインストールできます

pip install hashids

スニペット:

import hashids
hashids = hashids.Hashids(salt="this is my salt", )
print hashids.encode(1, 2, 3)
>>> laHquq

短い説明:

Hashidsは、数字から短い一意の非連続IDを生成する小さなオープンソースライブラリです。

0
user1767754