Python: как создать уникальное имя файла?


У меня есть веб-форма python с двумя вариантами -загрузить и textarea. Мне нужно взять значения из каждого и передать их в другую программу командной строки. Я могу легко передать имя файла с параметрами загрузки файла, но я не уверен, как передать значение textarea.

Я думаю, что мне нужно делать-это:

  1. создать уникальное имя файла
  2. создать временный файл с таким именем в рабочем каталог
  3. сохраните значения, переданные из textarea во временный файл
  4. выполните программу командной строки из моего модуля python и передайте ему имя временного файла

Я не уверен, как генерировать уникальное имя файла. Кто-нибудь может дать мне несколько советов о том, как генерировать уникальное имя файла? Любые алгоритмы, предложения и строки кода приветствуются.

Спасибо за заботу

7 60

7 ответов:

Я не думаю, что ваш вопрос был очень ясен, но если все, что вам нужно-это уникальное имя файла...

import uuid

unique_filename = str(uuid.uuid4())

Если вы хотите, чтобы временные файлы в Python есть модуль под названием tempfile в стандартных библиотеках Python. Если вы хотите запустить другие программы для работы с файлом, используйте tempfile.на mkstemp() для создания файлов, и ОС.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)

запустив это, вы должны найти, что cat команда работала отлично, но временный файл был удален в finally блок. Знайте, что вы есть чтобы удалить временный файл, который возвращает mkstemp () - библиотека не может знать, когда вы закончите с ним!

(Edit: я предполагал, что NamedTemporaryFile сделал именно то, что вам нужно, но это может быть не так удобно-файл удаляется сразу же после закрытия объекта temp file, и если другие процессы откроют файл до того, как вы его закроете, он не будет работать на некоторых платформах, в частности Windows. Извините, не получилось с моей стороны.)

The uuid модуль был бы хорошим выбором, я предпочитаю использовать uuid.uuid4().hex как случайное имя файла, потому что он будет возвращать 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 tempfile

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

print f.name
f.close()

F-это открытый файл. delete=False означает не удалять файл после закрытия.

можно использовать datetime модуль

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

обратите внимание, что: Я использую replace так как двоеточия не допускаются в именах файлов во многих операционных системах.

вот и все, это даст вам уникальное имя файла каждый раз.

я наткнулся на этот вопрос, и я добавлю свое решение для тех, кто может искать что-то подобное. Мой подход был просто сделать случайное имя файла из 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)

Это можно сделать с помощью уникальный на ufp.путь модуль.

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

если текущий путь существует тест.доб ' файл. ufp.путь.уникальная функция возврата './испытание (Д1).доб.

пример : создать уникальный путь в filepath или dirpath [Python]