Respostas:
Python possui recursos para gerar nomes de arquivos temporários, consulte http://docs.python.org/library/tempfile.html . Por exemplo:
In [4]: import tempfile
Cada chamada para tempfile.NamedTemporaryFile()
resulta em um arquivo temporário diferente, e seu nome pode ser acessado com o .name
atributo, por exemplo:
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'
Depois de obter o nome do arquivo exclusivo, ele pode ser usado como qualquer arquivo normal. Nota : Por padrão, o arquivo será excluído quando for fechado. No entanto, se o delete
parâmetro for False, o arquivo não será excluído automaticamente.
Conjunto completo de parâmetros:
tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])
também é possível especificar o prefixo para o arquivo temporário (como um dos vários parâmetros que podem ser fornecidos durante a criação do arquivo):
In [9]: tf = tempfile.NamedTemporaryFile(prefix="zz")
In [10]: tf.name
Out[10]: 'c:\\blabla\\locals~1\\temp\\zzrc3pzk'
Exemplos adicionais para trabalhar com arquivos temporários podem ser encontrados aqui
Você pode usar o módulo UUID para gerar uma string aleatória:
import uuid
filename = str(uuid.uuid4())
Esta é uma escolha válida, visto que é extremamente improvável que um gerador de UUID produza um identificador duplicado (um nome de arquivo, neste caso):
Somente depois de gerar 1 bilhão de UUIDs a cada segundo durante os próximos 100 anos, a probabilidade de criar apenas uma duplicata seria de cerca de 50%. A probabilidade de uma duplicata seria de cerca de 50% se cada pessoa na Terra possuísse 600 milhões de UUIDs.
uuid.uuid4().hex
para obter uma string hexadecimal sem traços ( -
).
uma abordagem comum é adicionar um carimbo de data / hora como prefixo / sufixo ao nome do arquivo para ter alguma relação temporal com o arquivo. Se precisar de mais exclusividade, você ainda pode adicionar uma string aleatória a isso.
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.
Se outro processo interromper o seu entre as etapas 1 e 2 e criar o arquivo, quando seu código for retomado, ele substituirá o arquivo do outro processo.
tempfile
módulo, que faz isso para você. :)
...strftime("%y%m%d_%H%M%S%f")
O OP solicitou a criação de nomes de arquivos aleatórios, não arquivos aleatórios . Vezes e UUIDs podem colidir. Se você estiver trabalhando em uma única máquina (não em um sistema de arquivos compartilhado) e seu processo / thread não piscar em si mesmo, use os.getpid () para obter seu próprio PID e use-o como um elemento de um nome de arquivo exclusivo. Outros processos obviamente não obteriam o mesmo PID. Se você for multithread, obtenha o id do thread. Se você tiver outros aspectos de seu código em que um único thread ou processo pode gerar vários arquivos temporários diferentes, pode ser necessário usar outra técnica. Um índice rolante pode funcionar (se você não os mantiver por tanto tempo ou usar tantos arquivos, você se preocuparia com o rollover). Manter um hash / índice global para arquivos "ativos" seria suficiente neste caso.
Desculpe pela explicação demorada, mas depende do seu uso exato.
Se você quiser preservar o nome do arquivo original como parte do novo nome de arquivo, prefixos exclusivos de comprimento uniforme podem ser gerados usando hashes MD5 da hora atual:
from hashlib import md5
from time import localtime
def add_prefix(filename):
prefix = md5(str(localtime()).encode('utf-8')).hexdigest()
return f"{prefix}_{filename}"
Chamadas para add_prefix ('style.css') geram sequência como:
a38ff35794ae366e442a0606e67035ba_style.css
7a5f8289323b0ebfdbc7c840ad3cb67b_style.css
Adicionando meus dois centavos aqui:
In [19]: tempfile.mkstemp('.png', 'bingo', '/tmp')[1]
Out[19]: '/tmp/bingoy6s3_k.png'
De acordo com o documento python para tempfile.mkstemp, ele cria um arquivo temporário da maneira mais segura possível. Observe que o arquivo existirá após esta chamada:
In [20]: os.path.exists(tempfile.mkstemp('.png', 'bingo', '/tmp')[1])
Out[20]: True
Eu pessoalmente prefiro que meu texto não seja apenas aleatório / único, mas bonito também, é por isso que gosto da biblioteca de hashids, que gera um texto aleatório bonito a partir de inteiros. Pode ser instalado através de
pip install hashids
Snippet:
import hashids
hashids = hashids.Hashids(salt="this is my salt", )
print hashids.encode(1, 2, 3)
>>> laHquq
Pequena descrição:
Hashids é uma pequena biblioteca de código aberto que gera ids curtos, exclusivos e não sequenciais a partir de números.
import uuid
imageName = '{}{:-%Y%m%d%H%M%S}.jpeg'.format(str(uuid.uuid4().hex), datetime.now())
Você pode usar o pacote aleatório:
import random
file = random.random()