2008-09-09 39 views
455

Dada una ruta como "mydir/myfile.txt", ¿cómo puedo encontrar la ruta de archivo absoluta relativa al directorio de trabajo actual en Python? P.ej. en Windows, podría terminar con:Cómo obtener una ruta de archivo absoluta en Python

"C:/example/cwd/mydir/myfile.txt" 
+0

Pregunta similar: https://stackoverflow.com/questions/7165 749/open-file-in-a-relative-location-in-python – Raj

Respuesta

641
>>> import os 
>>> os.path.abspath("mydir/myfile.txt") 
'C:/example/cwd/mydir/myfile.txt' 

también funciona si ya es una ruta absoluta:

>>> import os 
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt") 
'C:/example/cwd/mydir/myfile.txt' 
+16

Nota: En la mayoría de las plataformas, esto es equivalente a llamar a la función 'normpath()' de la siguiente manera: 'normpath (join (os.getcwd(), camino)) '. Entonces, si 'mydir/myfile.txt' no está debajo de' os.getcwd() ', la ruta absoluta es __no la ruta real__. – coanor

+23

@coanor? Sin una raíz explícita, 'mydir/myfile.txt' se refiere implícitamente a una ruta dentro del directorio de trabajo actual, por lo que es equivalente a'./Mydir/myfile.txt'. Puede que ese no sea el camino que intentabas ingresar, pero parece que la interpretación correcta del camino es lo que puedo decir. ¿Podrías elaborar? – jpmc26

47
>>> import os 
>>> os.path.abspath('mydir/myfile.txt') 
'C:\\example\\cwd\\mydir\\myfile.txt' 
>>> 
21

Mejor aún, instale el módulo path.py, que envuelve todo las funciones os.path y otras funciones relacionadas en los métodos de un objeto que se pueden usar donde se usan cadenas:

>>> from path import path 
>>> path('mydir/myfile.txt').abspath() 
'C:\\example\\cwd\\mydir\\myfile.txt' 
>>> 
+2

Lástima que nunca consiguieron un módulo de abstracción de nombre de archivo adecuado en el stdlib. –

+1

@Torsten Marek: es una omisión dolorosa y de larga data. – flow

+4

Lo hicieron ahora para Python 3.4: 'pathlib'. Ver mi respuesta en este hilo. – twasbrillig

42

Puede usar la nueva biblioteca de Python 3.4 pathlib. (También puede obtenerlo para Python 2.6 o 2.7 utilizando pip install pathlib). Los autores wrote: "El objetivo de esta biblioteca es proporcionar una jerarquía simple de clases para manejar las rutas del sistema de archivos y las operaciones comunes que los usuarios hacen sobre ellas".

para tener una ruta absoluta en Windows:

>>> from pathlib import Path 
>>> p = Path("pythonw.exe").resolve() 
>>> p 
WindowsPath('C:/Python27/pythonw.exe') 
>>> str(p) 
'C:\\Python27\\pythonw.exe' 

O en UNIX:

>>> from pathlib import Path 
>>> p = Path("python3.4").resolve() 
>>> p 
PosixPath('/opt/python3/bin/python3.4') 
>>> str(p) 
'/opt/python3/bin/python3.4' 

Docs están aquí: https://docs.python.org/3/library/pathlib.html

+3

Muy útil. El uso de 'os.path.abspath()' me dio un error: 'AttributeError: 'NoneType' objeto no tiene ningún atributo 'startswith'', utilizando' Path(). Resolve() 'no con el mismo archivo de acceso relativo. (Linux y Python3.4) – NuclearPeon

3

Yo prefiero usar pegote

aquí está cómo enumerar todos los tipos de archivos en su carpeta actual:

import glob 
for x in glob.glob(): 
    print(x) 

aquí es cómo enumerar todos (por ejemplo) los archivos .txt en la carpeta actual:

import glob 
for x in glob.glob('*.txt'): 
    print(x) 

aquí es cómo enumerar todos los tipos de archivos en un directorio elegido:

import glob 
for x in glob.glob('C:/example/hi/hello/'): 
    print(x) 

espero que esto te haya ayudado

+0

Parece que estás respondiendo una pregunta diferente. No fue "¿Cómo obtengo un camino?", Sino "un camino absoluto". Se podría aplicar la respuesta correcta ('os.path.abspath()') a la ruta relativa que 'glob' proporciona para sus dos primeros casos ... – NichtJens

-2
filePath = os.path.abspath(directoryName) 
filePathWithSlash = filePath + "\\" 
filenameWithPath = os.path.join(filePathWithSlash, filename) 
+0

La pregunta no era cómo cambiar el nombre de las imágenes o algo así. Solo se le solicitó su 5ª línea 'filePath = os.path ...' – derM

+0

derM Sí, tiene razón, estaba buscando otra cosa cuando publiqué eso. Eliminé lo que es irrelevante para la pregunta en esta página. –

Cuestiones relacionadas