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

我有一个Python Web表单有两个选项 – file uploadtextarea 。 我需要从每个值中取出值并传递给另一个命令行程序。 我可以很容易地通过file upload选项的文件名,但我不知道如何传递textarea的值。

我想我需要做的是:

  1. 生成一个唯一的文件名
  2. 在工作目录中创build一个具有该名称的临时文件
  3. 将从textarea传入的值保存到临时文件中
  4. 从我的python模块执行命令行程序,并将其传递给临时文件的名称

我不知道如何生成一个唯一的文件名。 任何人都可以给我一些关于如何生成一个唯一的文件名的提示? 任何algorithm,build议和代码行赞赏。

感谢你的关心

我不认为你的问题是非常清楚的,但如果你只需要一个独特的文件名…

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

如果你想用Python创build临时文件,那么在Python的标准库中有一个名为tempfile的模块。 如果要启动其他程序来操作文件,请使用tempfile.mkstemp()创build文件,使用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做了你究竟是什么,但可能不是那么方便 – 文件被临时删除临时文件对象closures时,并有其他进程打开文件,然后再closures它将无法在一些平台上运行,特别是Windows。抱歉,我的部分失败了。)

也许你需要独特的临时文件?

 import tempfile f = NamedTemporaryFile(mode='w+b', delete=False) print f.name f.close() 

f打开文件。 delete = False表示closures后不要删除文件

uuid模块将是一个不错的select,我更喜欢使用uuid.uuid4().hex作为随机文件名,因为它会返回一个没有破折号的hexstring

 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 

我遇到了这个问题,我会为那些可能正在寻找类似的人添加我的解决scheme。 我的方法是从ascii字符中随机创build一个文件名。 这将是一个很好的概率独特。

 from random import sample from string import digits, ascii_uppercase, ascii_lowercase from tempfile import gettempdir from os import path def rand_fname(suffix, length=8): chars = ascii_lowercase + ascii_uppercase + digits fname = path.join(gettempdir(), 'tmp-' + ''.join(sample(chars, length)) + suffix) return fname if not path.exists(fname) \ else rand_fname(suffix, length) 

这可以使用ufp.path模块中的独特function来完成。

 import ufp.path ufp.path.unique('./test.ext') 

如果当前path存在'test.ext'文件。 ufp.path.unique函数返回'./test(d1).ext'。

请参阅示例: 在filepath或dirpath中生成唯一path[Python]

您可以使用date时间模块

 import datetime uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.') 

请注意:我正在使用replace因为冒号在许多操作系统中不允许使用文件名。

就是这样,每次都会给你一个唯一的文件名。