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))