Answers:
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之后,仅创建一个副本的可能性就约为50%。如果地球上每个人都拥有6亿个UUID,则重复一次的可能性约为50%。
uuid.uuid4().hex
获取不带破折号(-
)的十六进制字符串。
一种常见的方法是在文件名中添加时间戳作为前缀/后缀,以使其与文件具有某种时间关系。如果您需要更多的唯一性,您仍然可以在其中添加随机字符串。
import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'
1. Test if file exists, 2. create file.
如果另一个进程在步骤1和2之间中断了您的竞争,并创建了文件,则在代码恢复时它将覆盖另一个进程的文件。
tempfile
为您处理该模块的模块。:)
...strftime("%y%m%d_%H%M%S%f")
如果要将原始文件名保留为新文件名的一部分,则可以使用当前时间的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 uuid
imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())
您可以使用随机包:
import random
file = random.random()