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

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

  • Как установить M2crypto в Windows
  • Как работать элементно по матрице типа scipy.sparse.csr_matrix?
  • Разделите список чисел на n кусков, чтобы куски имели (близкие к) равные суммы и сохраняли исходный порядок
  • Что такое хороший и бесплатный игровой движок?
  • Доступ к клавишам dict, как атрибут в Python?
  • Как проверить, существует ли ключ во внутреннем словаре внутри словаря в python?
  • Отсутствие модулей Matplotlib с подчеркиванием
  • Какова цель голой астерикс в аргументах функции?
  • 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)]) 
    Python - лучший язык программирования в мире.