Лучший способ генерации случайных имен файлов в Python

В Python, что хорошо, или лучший способ генерировать некоторый случайный текст для добавления к файлу (имени), который я сохраняю на сервере, просто чтобы убедиться, что он не перезаписывается. Спасибо!

9 Solutions collect form web for “Лучший способ генерации случайных имен файлов в Python”

У Python есть возможности генерировать временные имена файлов, см. http://docs.python.org/library/tempfile.html . Например:

In [4]: import tempfile 

Каждый вызов tempfile.NamedTemporaryFile() приводит к другому временному файлу, и его имя можно получить с помощью атрибута .name , например:

 In [5]: tf = tempfile.NamedTemporaryFile() In [6]: tf.name Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i' In [7]: tf = tempfile.NamedTemporaryFile() In [8]: tf.name Out[8]: 'c:\\blabla\\locals~1\\temp\\tmpr8vvme' 

Если у вас есть уникальное имя файла, оно может использоваться как обычный файл. Примечание . По умолчанию файл будет удален, когда он будет закрыт. Однако, если параметр delete False, файл не будет автоматически удален.

Полный набор параметров:

 tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]]) 

также можно указать префикс для временного файла (как один из различных параметров, который может быть предоставлен при создании файла):

 In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz") In [10]: tf.name Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk' 

Дополнительные примеры для работы с временными файлами можно найти здесь

Вы можете использовать модуль UUID для генерации случайной строки:

 import uuid filename = str(uuid.uuid4()) 

Это допустимый выбор, учитывая, что генератор UUID крайне маловероятен для создания дублирующего идентификатора (в данном случае это имя файла):

Только после генерации 1 миллиарда UUID каждую секунду в течение следующих 100 лет вероятность создания всего одного дубликата составит около 50%. Вероятность одного дубликата будет составлять около 50%, если каждому человеку на земле принадлежит 600 миллионов UUID.

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

 import datetime basename = "mylogfile" suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S") filename = "_".join([basename, suffix]) # eg 'mylogfile_120508_171442' 

OP запросил создать случайные имена файлов, а не случайные файлы . Времена и UUID могут столкнуться. Если вы работаете с одной машиной (а не с общей файловой системой), и ваш процесс / поток не будет топать на себе, используйте os.getpid (), чтобы получить свой собственный PID и использовать его как элемент уникального имени файла. Другие процессы, очевидно, не получат одинаковый PID. Если вы многопоточны, получите идентификатор потока. Если у вас есть другие аспекты вашего кода, в которых один поток или процесс может генерировать несколько разных tempfiles, вам может понадобиться использовать другой метод. Скользящий индекс может работать (если вы не держите их так долго или используете так много файлов, о которых вы бы беспокоились о опрокидывании). В этом случае достаточно хранить глобальный хеш / индекс для «активных» файлов.

Извините за длинное объяснение, но это зависит от вашего точного использования.

Если вы хотите сохранить исходное имя файла как часть нового имени файла, уникальные префиксы длины unifom могут быть созданы:

 def add_prefix(filename): from hashlib import md5 from time import localtime return "%s_%s" % (md5(str(localtime())).hexdigest(), filename) 

Вызовы в àdd_prefix ('style.css') генерируют последовательность, например:

 a38ff35794ae366e442a0606e67035ba_style.css 7a5f8289323b0ebfdbc7c840ad3cb67b_style.css 

Оформить заказ в библиотеке HashFS . Он поддерживает это и многое другое.

Добавляем мои два цента здесь:

 In [19]: tempfile.mkstemp('.png', 'bingo', '/tmp')[1] Out[19]: '/tmp/bingoy6s3_k.png' 

Согласно документу python для tempfile.mkstemp, он создает временный файл наиболее безопасным образом. Обратите внимание, что файл будет существовать после этого вызова:

 In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1]) Out[20]: True 

Вы можете использовать случайный пакет:

 import random file = random.random() 

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

 import random import string file_name = ''.join([random.choice(string.ascii_lowercase) for i in range(16)]) 
Interesting Posts

Что более эффективно .objects.filter (). Exists () или get () и попытка

Установка экспоненциальной функции через две точки данных с scipy curve_fit

Необработанные детали при распаковке кортежа / списка

Есть ли умный способ передать ключ default_factory defaultdict?

Использование регулярного выражения для замены повторений букв в верхнем регистре в python с помощью одной строчной буквы

печатать значения словаря, которые находятся внутри списка в python

ImportError: не может импортировать имя urandom

Ошибка при установке модуля rpy2 в Python с помощью easy_install

Затмение Eclipse: PyDev

Как добавить миниатюру в сообщение WordPress с помощью библиотеки xmlrpclib Python?

Как распечатать отчет о классификации scikit?

Оптимизация SciPy сгруппированными границами

Список словарей, в словаре – в Python

Импортировать библиотеку ошибок ghmm

Почему переменные значения в Python перечисляет один и тот же объект?

Python - лучший язык программирования в мире.