Python: Как создать уникальное имя файла? - программирование
Подтвердить что ты не робот

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

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

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

  • Создать уникальное имя файла
  • Создайте временный файл с этим именем в рабочем каталоге
  • Сохранить значения, переданные из текстового поля во временный файл
  • Выполнить программу командной строки из моего модуля python и передать ему имя временного файла

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

Спасибо за беспокойство

4b9b3361

Ответ 1

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

import uuid

unique_filename = str(uuid.uuid4())

Ответ 2

Если вы хотите создавать временные файлы в 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. Извините, не с моей стороны.)

Ответ 3

Модуль 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

Ответ 4

Возможно, вам нужен уникальный временный файл?

import tempfile

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

print f.name
f.close()

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

Ответ 5

Вы можете использовать модуль datetime

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

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

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

Ответ 6

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

Ответ 7

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

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

если текущий путь существует, файл 'test.ext'. Функция ufp.path.unique возвращает './test (d1).ext'.

Ответ 8

Чтобы создать уникальный путь к файлу, если он существует, используйте случайный пакет для создания нового имени строки для файла. Вы можете сослаться на код ниже для того же.

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

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