Python: Как создать уникальное имя файла? - PullRequest
79 голосов
/ 03 июня 2010

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

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

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

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

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

Ответы [ 7 ]

121 голосов
/ 03 июня 2010

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

import uuid

unique_filename = str(uuid.uuid4())
49 голосов
/ 03 июня 2010

Если вы хотите создавать временные файлы в 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 () возвращает самостоятельно - у библиотеки нет возможности узнать, когда вы закончите с этим!

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

21 голосов
/ 09 июля 2017

Модуль 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
12 голосов
/ 18 сентября 2014

Может быть, вам нужен уникальный временный файл?

import tempfile

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

print f.name
f.close()

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

7 голосов
/ 26 мая 2017

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

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

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

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

2 голосов
/ 22 марта 2015

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

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

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

2 голосов
/ 01 апреля 2013

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