A questão, número 10501247 , em stackoverflow dá a resposta como criar um arquivo temporário em Python.
Eu só preciso ter o nome do arquivo temporário no meu caso.
Chamar tempfile.NamedTemporaryFile () retorna o identificador de arquivo após a criação do arquivo real.
Existe uma maneira de obter apenas o nome do arquivo?
# Trying to get temp file path
tf = tempfile.NamedTemporaryFile()
temp_file_name = tf.name
tf.close()
# Here is my real purpose to get the temp_file_name
f = gzip.open(temp_file_name ,'wb')
...
python
temporary-files
Colina
fonte
fonte
NamedTemporaryFile
garante um nome exclusivo, (provavelmente) experimentando e tentando novamente se ele existir. Obter apenas um nome não garante que você possa realmente criar o arquivo mais tarde, você está se abrindo para a condição de corrida de outra pessoa usando o mesmo nome antes de você.Respostas:
Se você deseja apenas um nome de arquivo temporário, pode chamar a função interna do arquivo temporário
_get_candidate_names()
:Chamar
next
novamente, retornará outro nome, etc. Isso não fornece o caminho para a pasta temporária. Para obter o diretório 'tmp' padrão, use:fonte
temp_dir = tempfile.mkdtemp(prefix='some-prefix_')
criar com segurança um diretório temporário e retornar uma string com o caminho absoluto.next(tempfile._get_candidate_names())
não retorna necessariamente um caminho inexistente, é por isso que as interfaces de arquivo temporário em nível de usuário podem tentar vários nomes até que um não utilizado seja encontrado :tempfile.gettempdir()
vez de privadotempfile._get_default_tempdir()
.tempfile.mkdtemp
o usuário é responsável por deletar o diretório temporário e seu conteúdo quando feito com ele.Acho que a maneira mais fácil e segura de fazer isso é algo como:
Um diretório temporário é criado que só você pode acessar, portanto, não deve haver problemas de segurança, mas não haverá arquivos criados nele, portanto, você pode escolher qualquer nome de arquivo que deseja criar nesse diretório.
editar: No Python 3 você agora pode usar
tempfile.TemporaryDirectory()
como um gerenciador de contexto para lidar com a exclusão para você:fonte
tempfile.mkdtemp
o usuário é responsável por deletar o diretório temporário e seu conteúdo ao terminar com ele.tempfile.TemporaryDirectory()
como gerenciador de contexto, ele será excluído para você.Pode ser um pouco tarde, mas há algo de errado com isso?
fonte
without creating actual file in Python
.tempfile.mktemp()
faça isso.Mas observe que ele está obsoleto. No entanto, ele não criará o arquivo e é uma função pública em tempfile em comparação com o uso do
_get_candidate_names()
.O motivo pelo qual está obsoleto é devido ao intervalo de tempo entre chamar isso e realmente tentar criar o arquivo. No entanto, no meu caso, a chance disso é tão pequena e, mesmo que falhe, seria aceitável. Mas cabe a você avaliar seu caso de uso.
fonte
tempfile.mktemp
documentação). Portanto, isso não deve ser considerado aceitável.os.path.join(tempfile.mkdtemp(), 'something')
Lá pelo menos o diretório é criado (e pertencente a você, presumo).Combinando as respostas anteriores, minha solução é:
Faça
some_id
opcional se não for necessário para você.fonte
_get_candidate_names()
não existir, pode-se usar como padrão algum gerador de string semi-aleatório. Por exemplo, algum uuid.Como Joachim Isaksson disse nos comentários, se você apenas receber um nome, poderá ter problemas se algum outro programa usar esse nome antes do seu programa. As chances são mínimas, mas não impossíveis.
Portanto, a coisa segura a fazer nessa situação é usar o construtor GzipFile () completo, que tem a assinatura
GzipFile( [filename[, mode[, compresslevel[, fileobj]]]])
. Assim, você pode passar para ele o open fileobj e também um nome de arquivo, se desejar. Veja a documentação gzip para detalhes.fonte