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.