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

时间:2010-06-02 20:53:05

标签: python file unique

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

我认为我需要做的是:

  1. 生成唯一的文件名
  2. 在工作目录中创建一个具有该名称的临时文件
  3. 将从textarea传递的值保存到临时文件
  4. 从我的python模块中执行命令行程序,并将其传递给临时文件的名称
  5. 我不确定如何生成唯一的文件名。任何人都可以给我一些关于如何生成唯一文件名的提示吗?任何算法,建议和代码行都表示赞赏。

    感谢您的关注

9 个答案:

答案 0 :(得分:120)

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

import uuid

unique_filename = str(uuid.uuid4())

答案 1 :(得分:49)

如果你想在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。抱歉,我失败了。)

答案 2 :(得分:19)

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

答案 3 :(得分:12)

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

import tempfile

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

print f.name
f.close()

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

答案 4 :(得分:7)

您可以使用datetime模块

 public function formatCollection($collection)
 {
  $results = [];
     foreach (collect($collection)->chunk(2) as $chunk)
     {
         $results[] = [
             'date' => $chunk[0]['date'],
             'departure_time' => $chunk[0]['departure_time'],
             'arrival_time' => $chunk[1]['arrival_time'],
             'departure_place_id'=> $chunk[0]['departure_place_id'],
             'arrival_place_id' => $chunk[1]['departure_place_id']
         ];
     }

    return collect($results);
 }

请注意: 我正在使用import datetime uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.') ,因为许多操作系统中的文件名中不允许使用冒号。

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

答案 5 :(得分:2)

我遇到了这个问题,我会为可能正在寻找类似内容的人添加我的解决方案。我的方法只是从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)

答案 6 :(得分:2)

可以使用 ufp.path 模块中的唯一功能完成此操作。

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

如果当前路径存在&#39; test.ext&#39;文件。 ufp.path.unique函数返回&#39; ./ test(d1).ext&#39;。

参见示例: Generate unique path at filepath or dirpath [Python]

答案 7 :(得分:1)

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

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

现在您可以使用此路径相应地创建文件。

答案 8 :(得分:1)

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

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

相比

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