Python:如何创建唯一的文件名?

127 投票
9 回答
156198 浏览
提问于 2025-04-15 23:28

我有一个用Python做的网页表单,里面有两个选项 - 文件上传文本框。我需要把这两个选项的值拿出来,然后传给另一个命令行程序。对于文件上传的选项,我可以很容易地传递文件名,但我不太确定怎么把文本框的内容传过去。

我觉得我需要做的步骤是:

  1. 生成一个独特的文件名
  2. 在工作目录下创建一个临时文件,名字就是刚才生成的那个
  3. 把文本框里的内容保存到这个临时文件里
  4. 在我的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())

撰写回答