2012-08-03 26 views
58

Tengo una carpeta con diez archivos en la que quiero pasar. Al imprimir el nombre del archivo de mi código funciona bien:¿Cómo recorrer los archivos con Python?

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 intento abrir el archivo en el bucle consigo un error IO:

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 <module> 
log = open(f, 'r') 
IOError: [Errno 2] No such file or directory: '1' 
>>> 

¿Debo pasar la ruta completa del archivo incluso dentro del ciclo?

+0

¿Estás tratando de recorrer un árbol de directorios, ¿o simplemente te interesan los archivos regulares en un directorio/carpeta específica? – Levon

+0

Sé que esta pregunta tiene cuatro años, pero todavía no tiene una respuesta aceptada. – raoulcousins

Respuesta

24

Sí, necesita la ruta completa.

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

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

+5

'os.walk' desciende a subdirectorios, por lo que no debe usar' indir' aquí. Use 'root'. –

+1

buena captura, actualizada. – koblas

92

Si estás en busca de los archivos en un solo directorio (es decir, no son tratando de recorrer un árbol de directorios, el cual no se parece a), ¿por qué no simplemente usar 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 es para un archivo.

+0

el bucle OP no solo imprime los archivos en un directorio. Imprime los archivos (recursivamente) en cada directorio debajo del directorio de entrada también. – mgilson

+0

@mgilson Me falta que al mirar el código de OP (OP solo hace referencia a nombres de archivos no directorios) y parte de la pregunta es "carpeta con diez archivos en la que quiero pasar". .. ¿me salteé algo de información? – Levon

+0

Si el OP tiene la estructura del directorio: '.' contiene' archivo1', 'directorio1' y' directorio1' contiene 'archivo2'. el código del OP imprimirá 'file1',' file2' mientras que su solución imprimiría 'file1',' directory1'. (Lo siento, esto es realmente difícil de explicar en los comentarios). – mgilson

4

Los ejemplos de os.walk en the documentation 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 se espera que la función "abierta" para saber que la cadena "1" se supone que significa "/ home/des/test/1 "(a menos que"/home/des/test "sea su directorio de trabajo actual)?

4

He aquí un fragmento que va a recorrer el árbol de archivos para usted:

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

Hay que especificar la ruta que se está trabajando en:

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') 
Cuestiones relacionadas