Obtener la ruta del archivo abierto en Python

113

Si tengo un archivo abierto, ¿hay una osllamada para obtener la ruta completa como una cadena?

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

De f, ¿cómo llegaría "/Users/Desktop/febROSTER2012.xls"?

David542
fuente

Respuestas:

145

La clave aquí es el nameatributo del fobjeto que representa el archivo abierto. Lo consigues así:

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

Te ayuda?

Tadeck
fuente
4
Para archivos creados por: ¡ tempfile.TemporaryFile(mode='w', prefix='xxx', suffix='.txt')no funciona!
Victor
19
@Victor: lea la documentación del tempfilemódulo, especialmente para tempfile.NamedTemporaryFile, justo debajo de la documentación tempfile.TemporaryFileque mencionó. Este es un caso específico para el archivo temporal y, como se ve en los documentos, ya existe una solución. tempfile.TemporaryFileno está destinado a ser utilizado en caso de que desee leer el nombre.
Tadeck
12
Si crea un archivo mediante abierto ( 'foo.txt', 'w') y luego hacer f.name, sólo le proporciona la salida de foo.txt
searchengine27
Zans ofrece una solución que también funciona para rutas relativas. Vea su respuesta a continuación.
Markus
Hay tempfile.NamedTemporaryFile en caso de que necesite el nombre.
Apollo Data
96

Yo tuve exactamente el mismo problema. Si está utilizando una ruta relativa, os.path.dirname (ruta) solo devolverá la ruta relativa. os.path.realpath hace el truco:

>>> import os
>>> f = open('file.txt')
>>> os.path.realpath(f.name)
Zans
fuente
15
Esta es en realidad la verdadera respuesta.
BlueTrin
1
Esto solo funciona si la ruta de archivo relativa sigue siendo la ruta de archivo correcta. Si especifico el nombre del archivo como 'text.txt' desde el directorio '~ / Documents /' y luego cambio los directorios a '~ /', os.path.realpathdevolverá '~ / text.txt' en lugar de '~ / Documents / text.txt'.
K. Nielson
1
Noté un problema con realpath. No corrige el caso de los caracteres alfabéticos de los archivos, sino que mantiene el caso utilizado en la declaración abierta. Tenía la esperanza de que devolviera el nombre del archivo como realmente existe en el sistema de archivos. (Esto es Windows, por supuesto)
RufusVS
12

Y si solo desea obtener el nombre del directorio y no es necesario que el nombre del archivo lo acompañe, puede hacerlo de la siguiente manera convencional usando el osmódulo Python.

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

De esta forma puede hacerse con la estructura del directorio.

Ali Raza Bhayani
fuente
Esto devuelve una cadena vacía si usa f = open('febROSTER2012.xls'). ¿Cómo se puede llegar al camino completo?
NZD
3

También puedes conseguirlo así.

filepath = os.path.abspath(f.name)
answerSeeker
fuente
2
Lo que lo agregaría al directorio de trabajo actual, no al directorio donde realmente reside.
Bachsau