在 Python 中生成随机文件名的最佳方法

在 Python 中,如果要生成一些随机文本,并将其添加到保存到服务器的文件(名称)之前,只是为了确保它不会被覆盖,那么最好的方法是什么。谢谢!

135668 次浏览

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'

其他使用临时文件的示例可以在 给你中找到

您可以使用 UUID 模块生成一个随机字符串:

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

这是一个有效的选择,因为 UUID生成器极不可能产生重复的标识符(在本例中是文件名) :

只有在未来100年内每秒生成10亿个 UUID 之后,只生成一个重复 UUID 的概率才会达到50% 左右。如果地球上的每个人都拥有6亿 UUID,那么一个重复的概率大约是50% 。

一种常见的方法是将时间戳作为前缀/后缀添加到文件名中,以便与文件具有某种时间关系。如果需要更多的唯一性,仍然可以向其中添加随机字符串。

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

如果希望将原始文件名保留为新文件名的一部分,可以使用当前时间的 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

请求创建随机 文件名而不是随机 文件的 OP。时间和 UUID 可能发生冲突。如果您正在使用一台机器(而不是一个共享文件系统) ,并且您的进程/线程不会自我毁灭,那么使用 os.getpid()来获取您自己的 PID,并将它作为一个惟一文件名的元素。其他进程显然不会得到相同的 PID。如果您是多线程,请获取线程 ID。如果在代码的其他方面,单个线程或进程可以生成多个不同的临时文件,则可能需要使用其他技术。滚动索引可以工作(如果你没有保存这么长的时间或使用这么多的文件,你会担心滚动)。在这种情况下,保持“活动”文件的全局散列/索引就足够了。

抱歉解释得这么冗长,但这取决于你的具体用法。

我想补充一点:

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

根据 temfile.mktemp 的 python 文档,它以尽可能安全的方式创建一个临时文件。请注意,该文件将在此呼叫之后存在:

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

你可以使用随机包:

import random
file = random.random()

如果您不需要文件路径,只需要具有预定义长度的随机字符串,那么您可以使用类似下面这样的内容。

>>> import random
>>> import string


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

我个人更喜欢让我的文本不仅仅是随机/唯一的,而且是漂亮的,这就是为什么我喜欢 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
>>> import string
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'

您可以将‘ string.ascii _ Letters’更改为任何字符串格式,以便生成任何其他文本,例如移动 NO、 ID..。 enter image description here

随着日期和时间在每秒之后都发生变化,因此需要将数据时间与 uuid (通用唯一标识符)连接起来 这是你答案的完整代码

   import uuid
imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())
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