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

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

Python有生成临时文件名的function,请参阅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' 

一旦你有了唯一的文件名,它可以像任何常规文件一样使用。 注意 :默认情况下,文件closures时将被删除 。 但是,如果delete参数为False,则不会自动删除该文件。

全参数集:

 tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]]) 

还可以指定临时文件的前缀(作为在文件创build过程中可以提供的各种参数之一):

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

在这里可以find用于处理临时文件的其他示例

您可以使用UUID模块来生成随机string:

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

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

只有在未来100年内每秒产生10亿个UUID之后,创build一个副本的可能性大约为50%。 如果地球上每个人拥有6亿个UUID,一个重复的可能性大约是50%。

一种常用的方法是将时间戳添加为文件名的前缀/后缀以与文件有一定的时间关系。 如果你需要更多的唯一性,你仍然可以添加一个随机的string。

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

OP请求创build随机文件名而不是随机文件 。 时间和UUID可能会发生冲突。 如果你在一台机器上(而不是一个共享的文件系统)工作,你的进程/线程不会踩到本身,使用os.getpid()来获得你自己的PID,并把它作为一个唯一文件名的一个元素。 其他进程显然不会得到相同的PID。 如果您是multithreading的,请获取线程ID。 如果您有代码的其他方面,其中一个线程或进程可以生成多个不同的临时文件,您可能需要使用另一种技术。 一个滚动索引可以工作(如果你不保持这么久或使用这么多的文件,你会担心翻转)。 在这种情况下,将全局哈希/索引保持为“活动”文件就足够了。

所以对于这个长期的解释抱歉,但这取决于你的确切用法。

如果要将原始文件名保留为新文件名的一部分,则unifom长度的唯一前缀可通过以下方式生成:

 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 

在这里添加我的两分钱:

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

根据tempfile.mkstemp的python文档,它以最安全的方式创build临时文件。 请注意,此通话后文件将存在:

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

检出HashFS库。 它支持这个和更多。

如果你不需要文件path,但只有预定义长度的随机string,你可以使用这样的东西。

 import random import string file_name = ''.join([random.choice(string.ascii_lowercase) for i in range(16)]) 

我个人更喜欢让我的文本不只是随机/唯一的,但也很漂亮,这就是为什么我喜欢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 file = random.random()