Hacer un objeto de ruta con el módulo pathlib como:
p = pathlib.Path('file.txt') El objeto p apuntará a algún archivo en el sistema de archivos, ya que puedo hacer, por ejemplo p.read_text() .
¿Cómo puedo obtener la ruta absoluta del objeto p en una cadena?
Parece que puedo usar, por ejemplo os.path.abspath(p) para obtener la ruta absoluta, pero es incómodo usar un método os.path , ya que asumo que pathlib debería ser un reemplazo para os.path .
resolve() Simplemente use Path.resolve() así:
p = p.resolve() Esto hace que su ruta sea absoluta y reemplaza todas las partes relativas con partes absolutas y todos los enlaces simbólicos con rutas físicas. En los sistemas de archivos que no distinguen entre mayúsculas y minúsculas, también canonicalizará el caso ( file.TXT se convierte en file.txt ).
absolute() antes de Python 3.11 El método alternativo absolute() no se documentó ni probó antes de Python 3.11 (consulte la discusión en el informe de error creado por @Jim Fasarakis Hilliard).
Las correcciones se fusionaron en enero de 2022 .
La diferencia entre resolve y absolute es que absolute() no reemplaza las partes vinculadas simbólicamente (enlace simbólico) de la ruta, y nunca genera FileNotFoundError . Tampoco modifica el caso.
Si desea evitar resolve() (por ejemplo, desea conservar enlaces simbólicos, mayúsculas o partes relativas), use esto en Python <3.11:
p = Path.cwd() / "file.txt" Esto funciona incluso si la ruta que está proporcionando es absoluta; en ese caso, se ignora el cwd (directorio de trabajo actual).
Si el archivo no existe, en Python 3.6 a 3.9 en Windows, resolve() no antepone el directorio de trabajo actual. Consulte el problema 38671 , corregido en Python 3.10.
En las versiones de Python anteriores a la v3.6, resolve() FileNotFoundError si la ruta no está presente en el disco.
Entonces, si existe algún riesgo, verifique de antemano con p.exists() o intente/capte el error.
# check beforehand if p.exists(): p = p.resolve() # or except afterward try: p = p.resolve() except FileNotFoundError: # deal with the missing file here pass Si está tratando con una ruta que no está en el disco, para empezar, y no está en Python 3.6+, es mejor volver a os.path.abspath(str(p)) .
Desde 3.6 en adelante, resolve() solo genera FileNotFoundError si usa el argumento strict .
# might raise FileNotFoundError p = p.resolve(strict=True) Pero tenga cuidado, el uso strict hace que su código sea incompatible con las versiones de Python anteriores a la 3.6, ya que no aceptan el argumento strict .
Está buscando el método .absolute , si mi comprensión es correcta, cuya documentación establece:
>>> print(p.absolute.__doc__) Return an absolute version of this path. This function works even if the path doesn't point to anything. No normalization is done, ie all '.' and '..' will be kept along. Use resolve() to get the canonical path to a file.Con un archivo de prueba en mi sistema, esto devuelve:
>>> p = pathlib.Path('testfile') >>> p.absolute() PosixPath('/home/jim/testfile') Este método parece ser una adición nueva, y aún no documentada, a los objetos de herencia Path y Path .
Si simplemente desea la ruta y no desea verificar si el archivo existe, puede hacerlo
str(p)como documento en la sección Operaciones .