Ответ 1
Я не думал, что ваш вопрос очень ясен, но если вам нужно только уникальное имя файла...
import uuid
unique_filename = str(uuid.uuid4())
У меня есть веб-форма python с двумя параметрами - Загрузка файлов и textarea. Мне нужно взять значения из каждого и передать их в другую программу командной строки. Я могу легко передать имя файла с параметрами загрузки файлов, но я не уверен, как передать значение текстового поля.
Я думаю, что мне нужно сделать:
Я не уверен, как создать уникальное имя файла. Может ли кто-нибудь дать мне несколько советов о том, как создать уникальное имя файла? Любые алгоритмы, предложения и строки кода оценены.
Спасибо за беспокойство
Я не думал, что ваш вопрос очень ясен, но если вам нужно только уникальное имя файла...
import uuid
unique_filename = str(uuid.uuid4())
Если вы хотите создавать временные файлы в Python, там есть модуль под названием tempfile в стандартных библиотеках Python. Если вы хотите запустить другие программы для работы с файлом, используйте 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() возвращает самостоятельно - библиотека не знает, когда вы закончите с ней!
(Edit: Я предположил, что NamedTemporaryFile сделал именно то, что вам нужно, но это может быть не так удобно - файл сразу же удаляется, когда объект temp файла закрыт, а другие процессы открывают файл перед тем, он закрыт, он не будет работать на некоторых платформах, в частности Windows. Извините, не с моей стороны.)
Модуль 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 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.path.
import ufp.path
ufp.path.unique('./test.ext')
если текущий путь существует, файл 'test.ext'. Функция ufp.path.unique возвращает './test (d1).ext'.
Чтобы создать уникальный путь к файлу, если он существует, используйте случайный пакет для создания нового имени строки для файла. Вы можете сослаться на код ниже для того же.
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
Теперь вы можете использовать этот путь для создания файла соответственно.