Respuestas:
>>> 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'
normpath()
de la siguiente manera: normpath(join(os.getcwd(), path))
. Entonces, si mydir/myfile.txt
no lo haces os.getcwd()
, la ruta absoluta no es la ruta real .
mydir/myfile.txt
refiere 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?
abspath
funció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.
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.
relpath
path
relpath
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
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)
Mejor aún, instale el módulo (que se encuentra en PyPI
), envuelve todas las os.path
funciones 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'
>>>
pathlib
. Vea mi respuesta en este hilo.
from path import Path
entoncesPath('mydir/myfile.txt').abspath()
path
módulo diferente . El módulo vinculado utiliza una clase llamada path
.
Hoy también puede usar el unipath
paquete basado 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
que 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 Path
objetos con todas las funciones relevantes os.path
, incluido, 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 encabezado ~/
(la tilde se refiere al directorio de inicio del usuario) y expandvars
se ocupa de cualquier otra variable de entorno (como $HOME
).
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.
El módulo os
proporciona 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 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
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
os.path.abspath()
) a cualquier ruta relativa que glob
proporcione para sus primeros dos casos ...
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