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

我有一个 Python 网络表单,有两个选项-文件上传文字区。我需要从每个命令行获取值并将它们传递给另一个命令行程序。我可以很容易地传递文件名与文件上传选项,但我不知道如何传递文本区的值。

我觉得我需要做的是:

  1. 生成唯一的文件名
  2. Create a temporary file with that name in the working directory
  3. 将从 textarea 传递的值保存到临时文件中
  4. 从 python 模块内部执行命令行程序,并将临时文件的名称传递给它

我不确定如何生成唯一的文件名。有人能给我一些关于如何生成唯一文件名的提示吗?任何算法、建议和代码行都是值得赞赏的。

谢谢你的关心

137624 次浏览

我觉得你的问题不是很清楚但如果你只需要一个独特的文件名。

import uuid


unique_filename = str(uuid.uuid4())

如果希望在 Python 中创建临时文件,Python 的标准库中有一个名为 Tempfile的模块。如果希望启动其他程序对文件进行操作,可以使用 temfile.mkstep ()创建文件,使用 os.fdopen ()访问 mkstep ()提供的文件描述符。

顺便说一下,您说您正在从 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块中被删除了。请注意,您要删除 mktemp ()自己返回的临时文件 -库无法知道您什么时候完成了操作!

(Edit: I had presumed that NamedTemporaryFile did exactly what you're after, but that might not be so convenient - the file gets deleted immediately when the temp file object is closed, and having other processes open the file before you've closed it won't work on some platforms, notably Windows. Sorry, fail on my part.)

我遇到了这个问题,我将为那些可能正在寻找类似解决方案的人补充我的解决方案。我的方法只是从 ascii字符随机创建一个文件名。它很可能是唯一的。

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)

也许您需要唯一的临时文件?

import tempfile


f = tempfile.NamedTemporaryFile(mode='w+b', delete=False)


print f.name
f.close()

f is opened file. delete=False means do not delete file after closing.

如果需要控制文件的名称,可以选择使用字符串的 prefix=...suffix=...参数。见 https://docs.python.org/3/library/tempfile.html

这可以使用 Ufp.path模块中的 独一无二函数来完成。

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

如果当前路径存在‘ test.ext’文件. ufp.path.only 函数返回’./test (d1) . ext’。

您可以使用 日期时间模块

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

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

That's it, this will give you a unique filename every single time.

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

若要创建唯一的文件路径(如果存在) ,请使用随机包为文件生成新的字符串名称。你可以参考下面的代码。

import os
import random
import string


def getUniquePath(folder, filename):
path = os.path.join(folder, filename)
while os.path.exists(path):
path = path.split('.')[0] + ''.join(random.choice(string.ascii_lowercase) for i in range(10)) + '.' + path.split('.')[1]
return path

现在您可以使用这个路径来创建相应的文件。

如果您需要短的唯一 ID 作为您的文件名,请尝试 shortuuidshortuuid使用小写和大写字母和数字,并删除类似的字符,如 l,1,I,O 和0。

>>> import shortuuid
>>> shortuuid.uuid()
'Tw8VgM47kSS5iX2m8NExNa'
>>> len(ui)
22

compared to

>>> import uuid
>>> unique_filename = str(uuid.uuid4())
>>> len(unique_filename)
36
>>> unique_filename
'2d303ad1-79a1-4c1a-81f3-beea761b5fdf'