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


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

9 70

9 ответов:

Python имеет средства для создания временных имен файлов, см. http://docs.python.org/library/tempfile.html. например:

In [4]: import tempfile

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

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 миллионами Уид.

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

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

ОП просил создать случайный имена не случайный files. Времена и UUIDs могут столкнуться. Если вы работаете на одной машине (а не на общей файловой системе), и ваш процесс/поток не будет топать сам по себе, используйте ОС.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

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

import random
import string

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

добавить вот мои два цента:

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

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

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

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

pip install hashids

фрагмент:

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

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

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

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

import random
file = random.random()