Cómo obtener una ruta de archivo absoluta en Python
-
09-06-2019 - |
Pregunta
Dado un camino como "mydir/myfile.txt"
, ¿cómo encuentro la ruta absoluta del archivo en relación con el directorio de trabajo actual en Python?P.ej.en Windows, podría terminar con:
"C:/example/cwd/mydir/myfile.txt"
Solución
>>> 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'
Otros consejos
Podrías usar la nueva biblioteca Python 3.4. pathlib
.(También puedes obtenerlo para Python 2.6 o 2.7 usando pip install pathlib
.) Los autores escribió:"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 realizan sobre ellas".
Para obtener 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'
Los documentos están aquí: https://docs.python.org/3/library/pathlib.html
>>> import os
>>> os.path.abspath('mydir/myfile.txt')
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
Mejor aún, instale el módulo (que se encuentra en PyPI
), envuelve todos los os.path
funciones y otras funciones relacionadas en métodos en un objeto que se pueden usar dondequiera que se usen cadenas:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
Hoy también puedes utilizar el unipath
paquete que se basó en path.py
: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>
Recomendaría usar este paquete ya que ofrece una interfaz limpia para las utilidades comunes de os.path.
Actualización para Python 3.4+ pathlib
eso realmente responde a la pregunta:
from pathlib import Path
relative = Path("mydir/myfile.txt")
absolute = relative.absolute() # absolute is a Path object
Si solo necesita una cadena temporal, tenga en cuenta que puede usar Path
objetos con todas las funciones relevantes en os.path
, incluyendo por supuesto abspath
:
from os.path import abspath
absolute = abspath(relative) # absolute is a str object
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
Tenga en cuenta que expanduser
es necesario (en Unix) en caso de que la expresión dada para el nombre y la ubicación del archivo (o directorio) pueda contener un inicio ~/
(la tilde se refiere al directorio de inicio del usuario), y expandvars
se encarga de cualquier otra variable de entorno (como $HOME
).
prefiero usar glob
A continuación se explica cómo enumerar todos los tipos de archivos en su carpeta actual:
import glob
for x in glob.glob():
print(x)
A continuación se explica cómo enumerar todos (por ejemplo) los archivos .txt en su carpeta actual:
import glob
for x in glob.glob('*.txt'):
print(x)
A continuación se explica 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
Módulo os
proporciona una manera de encontrar la ruta de los abdominales.
PERO la mayoría de las rutas en Linux comienzan con ~
(tilde), que no da un resultado satisfactorio.
para que puedas usar srblib
para eso.
>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'
instalarlo usando python3 -m pip install srblib
si estás en una mac
import os
upload_folder = os.path.abspath("static/img/users")
esto le dará una ruta completa:
print(upload_folder)
mostrará la siguiente ruta:
>>>/Users/myUsername/PycharmProjects/OBS/static/img/user
En caso de que alguien esté usando Python y Linux y busque la ruta completa al archivo:
>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
Este siempre obtiene el nombre de archivo correcto del script actual, incluso cuando se llama desde otro script.Es especialmente útil cuando se utiliza subprocess
.
import sys,os
filename = sys.argv[0]
desde allí, puedes obtener la ruta completa del script con:
>>> os.path.abspath(filename)
'/foo/bar/script.py'
También facilita la navegación por las carpetas simplemente agregando /..
tantas veces como quieras subir en la jerarquía de directorios.
Para obtener el cwd:
>>> os.path.abspath(filename+"/..")
'/foo/bar'
Para la ruta principal:
>>> os.path.abspath(filename+"/../..")
'/foo'
Combinando "/.."
con otros nombres de archivo, puede acceder a cualquier archivo del sistema.
filePath = os.path.abspath(directoryName)
filePathWithSlash = filePath + "\\"
filenameWithPath = os.path.join(filePathWithSlash, filename)