128

在 Python 中,生成一些随机文本以添加到我保存到服务器的文件(名称)的好方法或最佳方法是什么,以确保它不会被覆盖。谢谢!

4

13 回答 13

162

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

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

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

仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。如果地球上每个人都拥有 6 亿个 UUID,那么出现重复的概率约为 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]]]]]])

也可以指定临时文件的前缀(作为可以在文件创建期间提供的各种参数之一):

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 可能会发生冲突。如果您在单台机器上工作(不是共享文件系统)并且您的进程/线程不会自行踩踏,请使用os.getpid()获取您自己的 PID 并将其用作唯一文件名的元素。其他进程显然不会获得相同的 PID。如果您是多线程的,请获取线程 ID。如果您的代码有其他方面,其中单个线程或进程可以生成多个不同的临时文件,您可能需要使用另一种技术。滚动索引可以工作(如果您不将它们保留这么长时间或使用这么多文件,您会担心翻转)。在这种情况下,为“活动”文件保留全局哈希/索引就足够了。

很抱歉冗长的解释,但这确实取决于您的确切用法。

于 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 回答
2

在这里添加我的两分钱:

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

根据 tempfile.mkstemp 的 python 文档,它以最安全的方式创建一个临时文件。请注意,该文件将在此调用后存在:

In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1])
Out[20]: True
于 2017-01-17T18:40:22.887 回答
2

由于日期和时间每秒钟都在变化,因此您需要将数据时间与 uuid(通用唯一标识符)连接起来,这是您答案的完整代码

   import uuid
   imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())
于 2020-06-29T12:18:48.330 回答
1

我个人更喜欢让我的文本不仅是随机的/唯一的,而且也很漂亮,这就是为什么我喜欢 hashids 库,它从整数生成漂亮的随机文本。可以通过安装

pip install hashids

片段:

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

简短的介绍:

Hashids 是一个小型开源库,可以从数字生成短的、唯一的、非连续的 id。

于 2017-11-19T07:20:42.303 回答
0
>>> import random
>>> import string    
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'

您可以根据需要将“string.ascii_letters”更改为任何字符串格式以生成任何其他文本,例如手机号码、ID ... 在此处输入图像描述

于 2019-06-26T03:11:47.437 回答
0
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")

于 2021-09-27T00:36:08.173 回答
0

在其他一些情况下,如果您需要随机文件名是合理的,请使用该faker模块。这将产生具有通用扩展名的“合理”文件名。此方法可能会在一段时间后发生名称冲突。我认为 prepend withuuid可能更好。

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

于 2021-11-09T03:31:14.480 回答
-2

您可以使用随机包:

import random
file = random.random()
于 2017-04-26T16:48:37.357 回答