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"?

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?


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)

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.


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)

2
O que o anexaria ao diretório de trabalho atual, não ao diretório onde ele realmente reside.
Bachsau
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.