python path os.path

Malentendido de python os.path.abspath



(3)

El problema está en su comprensión de os.listdir() no os.path.abspath() . os.listdir() devuelve los nombres de cada uno de los archivos en el directorio. Esto te dará:

img1.jpg img2.jpg ...

Cuando los pasas a os.path.abspath() , se ven como rutas relativas. Esto significa que es relativo al directorio desde donde está ejecutando su código. Es por esto que obtienes "D: / code / img1.jpg".

En su lugar, lo que desea hacer es unir los nombres de los archivos con la ruta del directorio que está listando.

os.path.abspath(os.path.join(directory, file))

Tengo el siguiente código:

directory = r''D:/images'' for file in os.listdir(directory): print(os.path.abspath(file))

Y quiero la siguiente salida:

  • D: / images / img1.jpg
  • D: / images / img2.jpg y así sucesivamente

Pero me sale otro resultado:

  • D: / code / img1.jpg
  • D: / code / img2.jpg

donde D: / code es mi directorio de trabajo actual y este resultado es el mismo que

os.path.normpath(os.path.join(os.getcwd(), file))

Entonces, la pregunta es: ¿Cuál es el propósito de os.path.abspath mientras que debo usar

os.path.normpath(os.path.join(directory, file))

para obtener la ruta absoluta real de mi archivo? Mostrar casos de uso reales si es posible.


Las funciones os.listdir y os.path nativas de Python son bastante de bajo nivel. La iteración a través de un directorio (o una serie de directorios descendentes) requiere que su programa arme las rutas de los archivos manualmente. Puede ser conveniente definir una función de utilidad que genere las rutas que necesitará una sola vez, de modo que la lógica del conjunto de rutas no tenga que repetirse en cada iteración de directorio. Por ejemplo:

import os def better_listdir(dirpath): """ Generator yielding (filename, filepath) tuples for every file in the given directory path. """ # First clean up dirpath to absolutize relative paths and # symbolic path names (e.g. `.`, `..`, and `~`) dirpath = os.path.abspath(os.path.expanduser(dirpath)) # List out (filename, filepath) tuples for filename in os.listdir(dirpath): yield (filename, os.path.join(dirpath, filename)) if __name__ == ''__main__'': for fname, fpath in better_listdir(''~''): print fname, ''->'', fpath

Alternativamente, hay módulos de ruta de "nivel superior" que se pueden emplear, como py.path , path.py y pathlib (ahora una parte estándar de Python, para la versión 3.4 y superior, pero disponible para 2.7 en adelante). Esos agregan dependencias a su proyecto, pero incluyen muchos aspectos del manejo de archivos, nombres de archivos y rutas de archivo.


listdir produce los nombres de archivo en un directorio, sin referencia al nombre del directorio en sí. Sin ninguna otra información, abspath solo puede formar una ruta absoluta desde el único directorio que puede conocer: el directorio de trabajo actual. Siempre puede cambiar el directorio de trabajo antes de su bucle:

os.chdir(directory) for f in os.listdir(''.''): print(os.path.abspath(f))