Cómo obtener una ruta de archivo absoluta en Python

Respuestas:

1056
>>> 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'
Sherbang
fuente
29
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(), path)). Entonces, si mydir/myfile.txtno lo haces os.getcwd(), la ruta absoluta no es la ruta real .
coanor
32
@coanor? Sin una raíz explícita, se mydir/myfile.txtrefiere implícitamente a una ruta dentro del directorio de trabajo actual, por lo que es equivalente a ./mydir/myfile.txt. Es posible que esa no sea la ruta que desea ingresar, pero parece ser la interpretación correcta de la ruta hasta donde puedo decir. ¿Podrías dar más detalles?
jpmc26
2
@ jpmc26 No sigo exactamente coanor, pero diría que (al contrario de lo que presumí), no existe un vínculo entre el argumento de la abspathfunción y un archivo real. Puede proporcionar cualquier nombre de ruta, los archivos inexistentes y las jerarquías de directorio están bien, y abspath simplemente resolverá los bits de la ruta (incluido el ..elemento " " del directorio padre ) y devolverá una cadena. Esto es solo una cadena calculada desde el directorio actual; Parece que cualquier correlación con un archivo real es accidental. Tratar os.path.abspath("/wow/junk/../blha/hooey"). Funciona.
Mike S
2
@MikeS Sinceramente, no estoy seguro de por qué sería un comportamiento inesperado. Es la ruta absoluta , no el archivo absoluto o el directorio. Si desea una verificación de existencia, llame os.path.exists. Por el contrario, los sistemas como PowerShell que insisten en la ruta existente con la función de resolución de ruta estándar son difíciles de usar.
jpmc26
1
@ jpmc26 Asumir que una ruta es solo una cadena que parece un nombre de ruta no está clara en absoluto, y va en contra de cómo he estado pensando y hablando de nombres de ruta durante muchos años. Cito los documentos de Python 3 para abspath: "Devuelve una versión absolutizada normalizada de la ruta del nombre de ruta ". No es una "... versión de la ruta de la cadena ". Un nombre de ruta, como lo define Posix, es "Una cadena que se utiliza para identificar un archivo". Los documentos de Python son explícitos sobre : "no se accede al sistema de archivos para confirmar la existencia o la naturaleza de ". Si el argumento aquí es obvio, ¿por qué ser explícito ? relpathpathrelpath
Mike S
77

Puede usar la nueva biblioteca Python 3.4 pathlib. (También puede obtenerlo para Python 2.6 o 2.7 usando pip install pathlib.) Los autores escribieron : "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

twasbrillig
fuente
44
Muy útil. Usar os.path.abspath()me dio un error: AttributeError: 'NoneType' object has no attribute 'startswith'usar Path().resolve()no tiene la misma ruta de archivo relativa. (Linux y Python3.4)
NuclearPeon
23

Mejor aún, instale el módulo (que se encuentra en PyPI), envuelve todas las os.pathfunciones y otras funciones relacionadas en métodos en un objeto que puede usarse dondequiera que se usen cadenas:

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>
Tom
fuente
2
Lástima que nunca obtuvieron un módulo de abstracción de nombre de archivo adecuado en stdlib.
Torsten Marek
1
@Torsten Marek: es una omisión dolorosa y de larga data.
fluye
44
Lo hicieron ahora para Python 3.4: pathlib. Vea mi respuesta en este hilo.
twasbrillig
Hay yypos en esta respuesta. Debería ser from path import PathentoncesPath('mydir/myfile.txt').abspath()
frakman1
No hay errores tipográficos, es posible que haya estado utilizando un pathmódulo diferente . El módulo vinculado utiliza una clase llamada path.
Tom
10

Actualización para Python 3.4+ pathlibque realmente responde 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 Pathobjetos con todas las funciones relevantes os.path, incluido, por supuesto abspath:

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object
Físico loco
fuente
9
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

Tenga en cuenta que expanduseres 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 encabezado ~/(la tilde se refiere al directorio de inicio del usuario) y expandvarsse ocupa de cualquier otra variable de entorno (como $HOME).

benjimin
fuente
6

Esto siempre obtiene el nombre de archivo correcto del script actual, incluso cuando se llama desde otro script. Es especialmente útil cuando se usa subprocess.

import sys,os

filename = sys.argv[0]

a partir de ahí, puede obtener la ruta completa del script con:

>>> os.path.abspath(filename)
'/foo/bar/script.py'

También facilita la navegación por las carpetas al agregar /..tantas veces como desee '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'

Al combinarlo "/.."con otros nombres de archivo, puede acceder a cualquier archivo en el sistema.

Lucas Azevedo
fuente
Esto no es lo que se preguntaba. Preguntaron sobre una ruta en relación con el directorio de trabajo actual, que no es lo mismo que el directorio del script, aunque a veces pueden terminar teniendo el mismo valor.
The Elemental of Creation
3

El módulo osproporciona una forma de encontrar la ruta de abs.

PERO la mayoría de las rutas en Linux comienzan con ~(tilde), lo que no da un resultado satisfactorio.

así que puedes usar srblibpara 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

https://pypi.org/project/srblib/

srbcheema1
fuente
1

Prefiero usar glob

A continuación, le mostramos cómo enumerar todos los tipos de archivos en su carpeta actual:

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

A continuación, le mostramos cómo enumerar todos los archivos .txt (por ejemplo) 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

F. Taylor
fuente
2
Parece que estás respondiendo una pregunta diferente. No era "¿Cómo consigo un camino?", Sino "un camino absoluto". Uno podría aplicar la respuesta correcta ( os.path.abspath()) a cualquier ruta relativa que globproporcione para sus primeros dos casos ...
NichtJens
1

si estás en una mac

import os
upload_folder = os.path.abspath("static/img/users")

esto te dará un camino completo:

print(upload_folder)

mostrará la siguiente ruta:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user
chikwapuro
fuente
1

En caso de que alguien esté usando Python y Linux y esté buscando la ruta completa al archivo:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
BND
fuente