Python:如何创建唯一的文件名?
我有一个用Python做的网页表单,里面有两个选项 - 文件上传和文本框。我需要把这两个选项的值拿出来,然后传给另一个命令行程序。对于文件上传的选项,我可以很容易地传递文件名,但我不太确定怎么把文本框的内容传过去。
我觉得我需要做的步骤是:
- 生成一个独特的文件名
- 在工作目录下创建一个临时文件,名字就是刚才生成的那个
- 把文本框里的内容保存到这个临时文件里
- 在我的Python模块里执行命令行程序,并把临时文件的名字传给它
我不太确定怎么生成一个独特的文件名。有没有人能给我一些建议,告诉我怎么生成一个独特的文件名?任何算法、建议或者代码片段都很受欢迎。
谢谢你的关心
9 个回答
57
如果你想在Python中创建临时文件,可以使用Python自带的一个模块,叫做 tempfile。如果你想启动其他程序来处理这些文件,可以用tempfile.mkstemp()来创建文件,然后用os.fdopen()来访问mkstemp()给你的文件描述符。
顺便问一下,你说你是在Python程序中运行命令?那你几乎肯定应该使用 subprocess 模块。
所以你可以很开心地写出像这样的代码:
import subprocess
import tempfile
import os
(fd, filename) = tempfile.mkstemp()
try:
tfile = os.fdopen(fd, "w")
tfile.write("Hello, world!\n")
tfile.close()
subprocess.Popen(["/bin/cat", filename]).wait()
finally:
os.remove(filename)
运行这段代码后,你会发现 cat
命令运行得很好,但临时文件是在 finally
块中被删除的。要注意,你 必须 自己删除mkstemp()返回的临时文件——这个库并不知道你什么时候用完它!
(补充说明:我原以为NamedTemporaryFile正好符合你的需求,但这可能不太方便——当临时文件对象关闭时,文件会立即被删除,而在你关闭之前让其他进程打开这个文件在某些平台上(特别是Windows)可能会不行。抱歉,这是我理解错了。)
61
使用 uuid
模块是个不错的选择,我更喜欢用 uuid.uuid4().hex
来生成随机文件名,因为它会返回一个没有破折号的十六进制字符串。
import uuid
filename = uuid.uuid4().hex
输出的结果应该像这样:
>>> import uuid
>>> uuid.uuid()
UUID('20818854-3564-415c-9edc-9262fbb54c82')
>>> str(uuid.uuid4())
'f705a69a-8e98-442b-bd2e-9de010132dc4'
>>> uuid.uuid4().hex
'5ad02dfb08a04d889e3aa9545985e304' # <-- this one
184
我觉得你的问题不是很清楚,不过如果你只是想要一个独特的文件名的话...
import uuid
unique_filename = str(uuid.uuid4())