¿Debo pasar la ruta completa de un archivo en otro directorio para abrir ()?

Tengo una carpeta con diez archivos que quiero recorrer. Cuando imprimo el nombre del archivo, mi código funciona bien:

import os indir = '/home/des/test' for root, dirs, filenames in os.walk(indir): for f in filenames: print(f) 

Que imprime:

 1 2 3 4 5 6 7 8 9 10 

Pero si bash abrir el archivo en el bucle, aparece un error de E / S:

 import os indir = '/home/des/test' for root, dirs, filenames in os.walk(indir): for f in filenames: log = open(f, 'r') Traceback (most recent call last): File "/home/des/my_python_progs/loop_over_dir.py", line 6, in  log = open(f, 'r') IOError: [Errno 2] No such file or directory: '1' >>> 

¿Debo pasar la ruta completa del archivo incluso dentro del bucle para open() ?

Sí, necesitas el camino completo.

 log = open(os.path.join(root, f), 'r') 

Es la solución rápida. Como señala el comentario, os.walk desciende a subdirectorios, por lo que necesita usar la raíz del directorio actual en lugar de indir como base para la unión de la ruta.

Si solo está buscando los archivos en un solo directorio (es decir, no está intentando atravesar un árbol de directorios, que no parece), por qué no simplemente usa os.listdir () :

 import os for fn in os.listdir('.'): if os.path.isfile(fn): print (fn) 

en lugar de os.walk () . Puede especificar una ruta de directorio como parámetro para os.listdir () . os.path.isfile () determinará si el nombre de archivo dado es para un archivo.

Tienes que especificar la ruta en la que estás trabajando:

 source = '/home/test/py_test/' for root, dirs, filenames in os.walk(source): for f in filenames: print f fullpath = os.path.join(source, f) log = open(fullpath, 'r') 

Los ejemplos de os.walk en la documentación muestran cómo hacer esto:

 for root, dirs, filenames in os.walk(indir): for f in filenames: log = open(os.path.join(root, f),'r') 

¿Cómo esperaba que la función “abrir” supiera que la cadena “1” se supone que significa “/ home / des / test / 1” (a menos que “/ home / des / test” sea su directorio de trabajo actual)?

Aquí hay un fragmento que recorrerá el árbol de archivos por ti:

 indir = '/home/des/test' for root, dirs, filenames in os.walk(indir): for f in filenames: print(f) log = open(indir + f, 'r')