Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

У 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'

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Если вы хотите сохранить исходное имя файла как часть нового имени файла, уникальные префиксы длины 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

Ответ 6

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

import random
import string

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

Я лично предпочитаю, чтобы мой текст был не только случайным/уникальным, но и красивым, поэтому мне нравится hashids lib, который генерирует красивый случайный текст из целых чисел. Может быть установлен через

pip install hashids

Отрывок:

import hashids
hashids = hashids.Hashids(salt="this is my salt", )
print hashids.encode(1, 2, 3)
>>> laHquq

Краткое описание:

Hashids - небольшая библиотека с открытым исходным кодом, которая генерирует короткие, уникальные, не последовательные идентификаторы из чисел.

Ответ 10

>>> import random
>>> import string    
>>> alias = ''.join(random.choice(string.ascii_letters) for _ in range(16))
>>> alias
'WrVkPmjeSOgTmCRG'

Вы можете изменить 'string.ascii_letters' на любой формат строки, как вам нравится, для создания любого другого текста, например, мобильного NO, ID... enter image description here

Ответ 11

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

import random
file = random.random()