簡體   English   中英

在 Python 中生成隨機文件名的最佳方法

[英]Best way to generate random file names in Python

在 Python 中,生成一些隨機文本以添加到我保存到服務器的文件(名稱)的好方法或最佳方法是什么,只是為了確保它不會覆蓋。 謝謝!

您可以使用UUID 模塊生成隨機字符串:

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

這是一個有效的選擇,因為UUID生成器極不可能產生重復的標識符(在這種情況下是文件名):

只有在接下來的 100 年中每秒生成 10 億個 UUID 之后,僅創建一個重復項的概率約為 50%。 如果地球上每個人都擁有 6 億個 UUID,一個重復的概率約為 50%。

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]]]]]])

還可以指定臨時文件的前綴(作為可以在文件創建期間提供的各種參數之一):

In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'

可以在此處找到使用臨時文件的其他示例

一種常見的方法是將時間戳作為前綴/后綴添加到文件名中,以便與文件具有某種時間關系。 如果您需要更多的唯一性,您仍然可以為此添加一個隨機字符串。

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

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

如果您不需要文件路徑,而只需要具有預定義長度的隨機字符串,您可以使用這樣的東西。

>>> import random
>>> import string

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

在這里加上我的兩分錢:

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

根據 python doc for tempfile.mkstemp,它以最安全的方式創建一個臨時文件。 請注意,該文件將在此調用后存在:

In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1])
Out[20]: True

我個人更喜歡讓我的文本不僅是隨機/獨特的,而且還很漂亮,這就是為什么我喜歡 hashids 庫,它從整數生成漂亮的隨機文本。 可以安裝通過

pip install hashids

片段:

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

簡短的介紹:

Hashids 是一個小型開源庫,可從數字生成簡短、唯一、非連續的 id。

由於日期和時間每秒鍾都會發生變化,因此您需要將數據時間與 uuid(通用唯一標識符)連接起來,這里是您答案的完整代碼

   import uuid
   imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())
>>> import random
>>> import string    
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'

您可以根據需要將“string.ascii_letters”更改為任何字符串格式,以生成任何其他文本,例如 mobile NO、ID ... 在此處輸入圖片說明

import random

def Generate(): #function generates a random 6 digit number
    code = ''
    for i in range(6):
        code += str(random.randint(0,9))
    return code

print(Generate()+".txt")

在其他一些情況下,如果您需要合理的隨機文件名,請使用faker模塊。 這將產生具有通用擴展名的“合理”文件名。 一段時間后,此方法可能會發生名稱沖突。 我認為加上uuid可能更好。

pip install faker

然后,

from faker import Faker

fake = Faker()
for _ in range(10):
    print(fake.file_name())

鏈接到faker文檔: https : //faker.readthedocs.io/en/master/index.html

您可以使用隨機包:

import random
file = random.random()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM