У меня есть веб-форма на Python с двумя вариантами: загрузка файла и текстовое поле . Мне нужно взять значения из каждого и передать их другой программе командной строки. Я могу легко передать имя файла с параметрами загрузки файла, но я не уверен, как передать значение текстового поля.
Я думаю, что мне нужно сделать следующее:
- Создать уникальное имя файла
- Создайте временный файл с таким именем в рабочем каталоге
- Сохраните значения, переданные из textarea, во временный файл
- Выполните программу командной строки из моего модуля python и передайте ей имя временного файла
Я не уверен, как создать уникальное имя файла. Может ли кто-нибудь дать мне несколько советов о том, как создать уникальное имя файла? Приветствуются любые алгоритмы, предложения и строки кода.
Спасибо за вашу заботу
Ответы:
Я не думал, что ваш вопрос был очень ясным, но если все, что вам нужно, это уникальное имя файла ...
import uuid unique_filename = str(uuid.uuid4())
источник
uuid.uuid4().hex
было бы лучше, подробности смотрите здесь .Если вы хотите создавать временные файлы в 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)
Запустив это, вы должны обнаружить, что
cat
команда работала отлично, но временный файл был удален вfinally
блоке. Имейте в виду, что вы должны удалить временный файл, который возвращает mkstemp () самостоятельно - библиотека не имеет возможности узнать, когда вы закончили с ним!(Изменить: я предполагал, что NamedTemporaryFile сделал именно то, что вам нужно, но это может быть не так удобно - файл удаляется немедленно, когда объект временного файла закрывается, и другие процессы открывают файл до того, как вы его закрыли не будет работать на некоторых платформах, особенно на 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
означает не удалять файл после закрытия.Если вам нужен контроль над именем файла, есть необязательные аргументы
prefix=...
иsuffix=...
аргументы, которые принимают строки. См. Https://docs.python.org/3/library/tempfile.html .источник
w+b
по умолчаниюmode
.tempfile
Недостатком использования любой функции является неправильное разрешение доступа к файлу:tempfile
документы должны использоваться вos.O_TMPFILE
качестве маски, но при обычном создании файла учитываетсяos.umask()
.Вы можете использовать модуль 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)
источник
path.exists()
возвратаFalse
и моментом фактического открытия файла потребителем существует состояние гонки .Это можно сделать с помощью уникальной функции в модуле 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
Теперь вы можете использовать этот путь для создания файла соответственно.
источник
Если вам нужны короткие уникальные идентификаторы в качестве имени файла, попробуйте
shortuuid
, shortuuid использует строчные и прописные буквы и цифры и удаляет похожие символы, такие как 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'
источник