Obter caminho do arquivo aberto em Python

113

Se eu tiver um arquivo aberto, há uma oschamada para obter o caminho completo como uma string?

f = open('/Users/Desktop/febROSTER2012.xls')

De f, como eu iria conseguir "/Users/Desktop/febROSTER2012.xls"?

David542
fonte

Respostas:

145

A chave aqui é o nameatributo do fobjeto que representa o arquivo aberto. Você entende assim:

>>> f = open('/Users/Desktop/febROSTER2012.xls')
>>> f.name
'/Users/Desktop/febROSTER2012.xls'

Ajuda?

Tadeck
fonte
4
Para arquivos criados por: tempfile.TemporaryFile(mode='w', prefix='xxx', suffix='.txt')não funciona!
Victor
19
@Victor: Por favor, leia a documentação do tempfilemódulo, especialmente para tempfile.NamedTemporaryFile, logo abaixo da documentação para tempfile.TemporaryFilevocê mencionou. Este é o caso específico do arquivo temporário e, conforme visto na documentação, já existe uma solução. tempfile.TemporaryFilenão deve ser usado caso você queira ler o nome.
Tadeck
12
Se você criar um arquivo usando open ('foo.txt', 'w') e, em seguida, f.name, ele fornecerá apenas a saída foo.txt
searchengine27
Zans oferece uma solução que também funciona para caminhos relativos. Veja sua resposta abaixo.
Markus
Existe tempfile.NamedTemporaryFile caso você precise do nome.
Apollo Data
96

Eu tinha exatamente o mesmo problema. Se você estiver usando um caminho relativo, os.path.dirname (path) retornará apenas o caminho relativo. os.path.realpath faz o truque:

>>> import os
>>> f = open('file.txt')
>>> os.path.realpath(f.name)
Zans
fonte
15
Esta é realmente a verdadeira resposta.
BlueTrin
1
Isso só funciona se o caminho de arquivo relativo ainda for o caminho de arquivo correto. Se eu especificar o nome do arquivo como 'text.txt' do diretório '~ / Documents /' e alterar os diretórios para '~ /', os.path.realpathretornarei '~ / text.txt' em vez de '~ / Documents / text.txt'.
K. Nielson
1
Percebi um problema com o realpath. Ele não corrige o caso dos caracteres alfa do arquivo, mas mantém o caso usado na instrução aberta. Eu esperava que ele retornasse o nome do arquivo como ele realmente existe no sistema de arquivos. (Este é o Windows, é claro)
RufusVS
12

E se você quiser apenas obter o nome do diretório e não precisar do nome do arquivo com ele, você pode fazer isso da seguinte maneira convencional usando o osmódulo Python.

>>> import os
>>> f = open('/Users/Desktop/febROSTER2012.xls')
>>> os.path.dirname(f.name)
>>> '/Users/Desktop/'

Dessa forma, você pode obter a estrutura do diretório.

Ali Raza Bhayani
fonte
Isso retorna uma string vazia se você usar f = open('febROSTER2012.xls'). Como você pode chegar ao caminho completo?
NZD
3

Você pode conseguir assim também.

filepath = os.path.abspath(f.name)
answerSeeker
fonte
2
O que o anexaria ao diretório de trabalho atual, não ao diretório onde ele realmente reside.
Bachsau