Em Python, qual é uma boa ou a melhor maneira de gerar algum texto aleatório para preceder a um arquivo (nome) que estou salvando em um servidor, apenas para ter certeza de que não será sobrescrito. Obrigado!
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:
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):
fonte
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.
fonte
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.
fonte
Se você não precisa do caminho do arquivo, mas apenas da string aleatória com comprimento predefinido, você pode usar algo assim.
fonte
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:
Chamadas para add_prefix ('style.css') geram sequência como:
fonte
Adicionando meus dois centavos aqui:
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:
fonte
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:
Pequena descrição:
fonte
Você pode alterar 'string.ascii_letters' para qualquer formato de string conforme desejar para gerar qualquer outro texto, por exemplo, móvel NO, ID ...
fonte
fonte
Você pode usar o pacote aleatório:
fonte