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

Mys*_*des 84 python file unique

我有一个python web表单有两个选项 - 文件上传textarea.我需要从每个值中获取值并将它们传递给另一个命令行程序.我可以轻松地使用文件上传选项传递文件名,但我不知道如何传递textarea的值.

我想我需要做的是:

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

我不知道如何生成唯一的文件名.任何人都可以给我一些关于如何生成唯一文件名的提示吗?任何算法,建议和代码行都是值得赞赏的.

感谢你的关心

Eni*_*rry 129

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

import uuid

unique_filename = str(uuid.uuid4())
Run Code Online (Sandbox Code Playgroud)

  • 我认为`uuid.uuid4().hex`将是一个更好的选择,详见[这里](/sf/answers/3149459281/). (5认同)
  • @ToloPalmer:您的计算机CPU更有可能导致加载错误文件的处理错误,而不是生成的UUID与任何现有值发生冲突.UUID在计算模型中生成一个唯一的名称,该模型可以理解并非所有计算都是纯数学. (4认同)
  • 请原谅我无知的旧评论......确实不是唯一但不太可能碰撞,所以很好的选择;) (2认同)

Ric*_*ell 50

如果你想在Python中创建临时文件,Python的标准库中有一个名为tempfile的模块.如果要启动其他程序来操作该文件,请使用tempfile.mkstemp()创建文件,使用os.fdopen()访问mkstemp()为您提供的文件描述符.

顺便说一句,你说你正在运行Python程序的命令?您几乎肯定会使用子进程模块.

所以你可以非常愉快地编写看起来像这样的代码:

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)
Run Code Online (Sandbox Code Playgroud)

运行它,您应该发现该cat命令运行良好,但临时文件已在finally块中删除.请注意,您必须删除mkstemp()自己返回的临时文件 - 库无法知道您何时完成它!

(编辑:我曾假设NamedTemporaryFile完全按照你所做的那样,但这可能不那么方便 - 当临时文件对象关闭时,文件会被立即删除,并且在关闭文件之前让其他进程打开文件将无法在某些平台上运行,尤其是Windows.抱歉,我失败了.)


Gre*_* Li 25

uuid模块将是一个不错的选择,我更喜欢使用uuid.uuid4().hex随机文件名,因为它将返回没有破折号的十六进制字符串.

import uuid
filename = uuid.uuid4().hex
Run Code Online (Sandbox Code Playgroud)

输出应该是这样的:

>>> import uuid
>>> uuid.uuid()
UUID('20818854-3564-415c-9edc-9262fbb54c82')
>>> str(uuid.uuid4())
'f705a69a-8e98-442b-bd2e-9de010132dc4'
>>> uuid.uuid4().hex
'5ad02dfb08a04d889e3aa9545985e304'  # <-- this one
Run Code Online (Sandbox Code Playgroud)

  • 通常,您会使用破折号来分隔文件名中的单词(例如“my-favorite-shoes.jpg”)。不过,如果文件名是随机生成的,我更喜欢不带破折号的文件名,这样更美观,而且这里的破折号没有意义。 (4认同)
  • 有破折号有什么问题吗? (3认同)

小智 13

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

import tempfile

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

print f.name
f.close()
Run Code Online (Sandbox Code Playgroud)

f是打开的文件.delete=False表示关闭后不删除文件.


Mil*_*ore 7

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

>>> import shortuuid
>>> shortuuid.uuid()
'Tw8VgM47kSS5iX2m8NExNa'
>>> len(ui)
22
Run Code Online (Sandbox Code Playgroud)

相比

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


小智 6

您可以使用datetime模块

import datetime
uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')
Run Code Online (Sandbox Code Playgroud)

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

就是这样,每次都会给你一个独特的文件名.

  • 除非文件名是紧接彼此创建的(例如循环)。然后他们是一样的。 (2认同)