Вопрос по python, random, hash – Лучший способ генерировать случайные имена файлов в Python

74

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

Ваш Ответ

9   ответов
7

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

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

80

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

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

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

Only after generating 1 billion UUIDs every second for the next 100 years, the probability of creating just one duplicate would be about 50%. The probability of one duplicate would be about 50% if every person on earth owns 600 million UUIDs.

Или использоватьuuid.uuid4().hex получить шестнадцатеричную строку без тире (-).
это также очень полезно, когда вам нужно уникальное имя файла, но вы еще не хотите, чтобы оно было создано.
5

ла, уникальные префиксы одинаковой длины можно сгенерировать следующим образом:

def add_prefix(filename):

  from hashlib import md5
  from time import localtime

  return "%s_%s" % (md5(str(localtime())).hexdigest(), filename)

Вызов & # xE0; dd_prefix ("style.css") генерирует последовательность вроде:

a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css
Чтобы избежать: Unicode-объекты должны быть закодированы перед хэшированием. Я изменил на md5 (str (localtime ()). Encode ('utf-8 & apos;)). Hexdigest ()
4

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

import random
import string

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

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

pip install hashids

Snippet:

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

Short Description:

Hashids is a small open-source library that generates short, unique, non-sequential ids from numbers.

1

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
-1

import random
file = random.random()
file = str (random.random ())
Это генерирует случайные числа, а не случайный текст.
11

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

import datetime
basename = "mylogfile"
suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
filename = "_".join([basename, suffix]) # e.g. 'mylogfile_120508_171442'
В многопоточной среде возможное состояние гонки, вовлеченное в последовательность1. Test if file exists, 2. create file. Если другой процесс прервет ваш процесс между шагами 1 и 2 и создаст файл, то при возобновлении кода он перезапишет другой процесс & apos; файл.
@ Li-AungYip Кроме того, можно также использовать 6-8random character sequence (в случае, если 2 файла генерируются за одну секунду).
@bobobobo: Или вы можете использоватьtempfile модуль, который обрабатывает это для вас. :)
89

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'

Если у вас есть уникальное имя файла, его можно использовать как любой обычный файл.Note: По умолчанию файл будетdeleted когда он является закрыто. Однако если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'

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

Проблема этого решения заключается в том, что оно генерирует не только имя файла, но и файл, который уже открыт. Если вам понадобится временное имя файла для нового, еще не существующего файла (например, для использования в качестве вывода команды os), это не подойдет. В этом случае вы можете сделать что-то вроде str (uuid.uuid4 ()).
Это зависит. Возможно, ему нужно имя для создания соответствующего вызова сервера. Точно сказать не могу. Во всяком случае, ваш ответ, безусловно, более распространенный случай.
Будут ли эти файлы удалены при следующей перезагрузке компьютера?
@Luca Спасибо за дополнительный комментарий, который полезен и отмечен для дальнейшего использования. Тем не менее, ОП четко заявил, что он / она хочет сохранить файл, следовательно, необходимо его открыть, поэтому это решение предусматривает это.

Похожие вопросы