Eu tenho um formulário da web em python com duas opções - upload de arquivo e textarea . Preciso pegar os valores de cada um e passá-los para outro programa de linha de comando. Posso passar facilmente o nome do arquivo com opções de upload de arquivo, mas não tenho certeza de como passar o valor da textarea.
Acho que o que preciso fazer é:
- Gere um nome de arquivo único
- Crie um arquivo temporário com esse nome no diretório de trabalho
- Salve os valores passados de textarea no arquivo temporário
- Execute o programa de linha de comando de dentro do meu módulo python e passe a ele o nome do arquivo temporário
Não tenho certeza de como gerar um nome de arquivo exclusivo. Alguém pode me dar algumas dicas sobre como gerar um nome de arquivo exclusivo? Quaisquer algoritmos, sugestões e linhas de código são apreciados.
Obrigado pela preocupação
Respostas:
Não achei que sua pergunta fosse muito clara, mas se você só precisa de um nome de arquivo exclusivo ...
fonte
uuid.uuid4().hex
seria uma escolha melhor, veja detalhes aqui .Se você quiser fazer arquivos temporários em Python, existe um módulo chamado tempfile nas bibliotecas padrão do Python. Se você deseja iniciar outros programas para operar no arquivo, use tempfile.mkstemp () para criar arquivos e os.fdopen () para acessar os descritores de arquivo que mkstemp () fornece.
A propósito, você diz que está executando comandos de um programa Python? É quase certo que você esteja usando o módulo de subprocesso .
Assim, você pode escrever alegremente um código semelhante a:
Executando isso, você deve descobrir que o
cat
comando funcionou perfeitamente bem, mas o arquivo temporário foi excluído dofinally
bloco. Esteja ciente de que você tem para excluir o arquivo temporário que mkstemp () retorna-se - a biblioteca tem nenhuma maneira de saber quando você está feito com ele!(Editar: eu presumi que NamedTemporaryFile fazia exatamente o que você estava procurando, mas isso pode não ser tão conveniente - o arquivo é excluído imediatamente quando o objeto de arquivo temporário é fechado e outros processos abrem o arquivo antes de você fechá-lo não funcionará em algumas plataformas, especialmente Windows. Desculpe, falha da minha parte.)
fonte
O
uuid
módulo seria uma boa escolha, prefiro usaruuid.uuid4().hex
como nome de arquivo aleatório porque retornará uma string hexadecimal sem travessões .As saídas devem ser assim:
fonte
Talvez você precise de um arquivo temporário exclusivo?
f é um arquivo aberto.
delete=False
significa não excluir o arquivo após o fechamento.Se você precisa de controle sobre o nome do arquivo, existem argumentos opcionais
prefix=...
esuffix=...
que aceitam strings. Consulte https://docs.python.org/3/library/tempfile.html .fonte
w+b
é o padrãomode
. O uso de qualquertempfile
funcionalidade tem a desvantagem de permissões de acesso ao arquivo incorretas:tempfile
documentos a serem usadosos.O_TMPFILE
como máscara, mas a criação normal de arquivos respeitaos.umask()
.Você pode usar o módulo datetime
Observe que: Estou usando,
replace
pois os dois pontos não são permitidos em nomes de arquivos em muitos sistemas operacionais.É isso, isso lhe dará um nome de arquivo único a cada vez.
fonte
Eu me deparei com esta pergunta e adicionarei minha solução para aqueles que podem estar procurando algo semelhante. Minha abordagem foi apenas fazer um nome de arquivo aleatório a partir de
ascii
caracteres. Será único com uma boa probabilidade.fonte
path.exists()
retornaFalse
e a hora em que o consumidor realmente abre o arquivo.Isso pode ser feito usando a função exclusiva no módulo ufp.path .
se o caminho atual existir, o arquivo 'test.ext'. retorno da função ufp.path.unique './test (d1) .ext'.
fonte
Para criar um caminho de arquivo exclusivo, se houver, use o pacote aleatório para gerar um novo nome de string para o arquivo. Você pode consultar o código abaixo para o mesmo.
Agora você pode usar este caminho para criar o arquivo de acordo.
fonte
Caso você precise de IDs curtos e exclusivos como nome de arquivo, tente
shortuuid
, shortuuid usa letras e dígitos em caixa baixa e caixa alta, e remove caracteres de aparência semelhante, como l, 1, I, O e 0.comparado com
fonte