Obtenir le chemin du fichier ouvert en Python

113

Si j'ai un fichier ouvert, y a-t-il un osappel pour obtenir le chemin complet sous forme de chaîne?

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

De f, comment pourrais-je obtenir "/Users/Desktop/febROSTER2012.xls"?

David542
la source

Réponses:

145

La clé ici est l' nameattribut de l' fobjet représentant le fichier ouvert. Vous obtenez comme ça:

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

Aide-t-il?

Tadeck
la source
4
Pour les fichiers créés par: tempfile.TemporaryFile(mode='w', prefix='xxx', suffix='.txt')ne fonctionne pas!
Victor
19
@Victor: Veuillez lire la documentation du tempfilemodule, en particulier pour tempfile.NamedTemporaryFile, juste en dessous de la documentation que tempfile.TemporaryFilevous avez mentionnée. C'est un cas particulier pour le fichier temporaire et, comme vu dans la documentation, il existe déjà une solution. tempfile.TemporaryFilen'est pas destiné à être utilisé au cas où vous voudriez lire le nom.
Tadeck
12
Si vous créez un fichier en utilisant open ('foo.txt', 'w') puis faites f.name, il ne vous fournit que la sortie foo.txt
searchengine27
Zans donne une solution qui fonctionne également pour les chemins relatifs. Voir sa réponse ci-dessous.
Markus le
Il y a tempfile.NamedTemporaryFile au cas où vous auriez besoin du nom.
Apollo Data
96

J'ai eu exactement le même problème. Si vous utilisez un chemin relatif, os.path.dirname (chemin) ne renverra que le chemin relatif. os.path.realpath fait l'affaire:

>>> import os
>>> f = open('file.txt')
>>> os.path.realpath(f.name)
Zans
la source
15
C'est en fait la vraie réponse.
BlueTrin
1
Cela ne fonctionne que si le chemin de fichier relatif est toujours le chemin de fichier correct. Si je spécifie le nom de fichier comme «text.txt» depuis le répertoire «~ / Documents /» et que je change de répertoire en «~ /», os.path.realpathje renverrai «~ / text.txt» au lieu de «~ / Documents / text.txt».
K. Nielson
1
J'ai remarqué un problème avec realpath. Il ne corrige pas la casse des caractères alpha des fichiers mais conserve plutôt la casse utilisée dans l'instruction open. J'avais espéré qu'il renverrait le nom du fichier tel qu'il existe réellement sur le système de fichiers. (Ceci est Windows, bien sûr)
RufusVS
12

Et si vous voulez simplement obtenir le nom du répertoire et que vous n'avez pas besoin du nom de fichier qui l'accompagne, vous pouvez le faire de la manière conventionnelle suivante en utilisant osle module Python.

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

De cette façon, vous pouvez obtenir la structure des répertoires.

Ali Raza Bhayani
la source
Cela renvoie une chaîne vide si vous utilisez f = open('febROSTER2012.xls'). Comment pouvez-vous accéder au chemin complet?
NZD
3

Vous pouvez aussi l'obtenir comme ça.

filepath = os.path.abspath(f.name)
réponseSeeker
la source
2
Ce qui l'ajouterait au répertoire de travail actuel, pas au répertoire où il réside réellement.
Bachsau