Python le da a FileNotFoundError el nombre de archivo devuelto por os.listdir

Estaba intentando iterar sobre los archivos en un directorio como este:

import os path = r'E:/somedir' for filename in os.listdir(path): f = open(filename, 'r') ... # process the file 

Pero Python estaba lanzando FileNotFoundError a pesar de que el archivo existe:

 Traceback (most recent call last): File "E:/ADMTM/TestT.py", line 6, in  f = open(filename, 'r') FileNotFoundError: [Errno 2] No such file or directory: 'foo.txt' 

Entonces, ¿qué está mal aquí?

Es porque os.listdir no devuelve la ruta completa al archivo, solo la parte del nombre del archivo; eso es 'foo.txt' , cuando abrir querría 'E:/somedir/foo.txt' porque el archivo no existe en el directorio actual.

Use os.path.join para anteponer el directorio a su nombre de archivo:

 path = r'E:/somedir' for filename in os.listdir(path): with open(os.path.join(path, filename)) as f: ... # process the file 

(Además, no está cerrando el archivo; el bloque with se encargará de él automáticamente).

os.listdir(directory) devuelve una lista de nombres de archivos en el directory . Entonces, a menos que el directory sea ​​su directorio de trabajo actual, debe unir esos nombres de archivo con el directorio real para obtener una ruta absoluta adecuada:

 for filename in os.listdir(path): filepath = os.path.join(path, filename) f = open(filepath,'r') raw = f.read() # ...