2012-08-03 20 views
58

Ho una cartella con dieci file in cui voglio eseguire il ciclo. Quando stampo il nome del file il mio codice funziona bene:Come eseguire il loop dei file con Python?

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

che stampa:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Ma se provo ad aprire il file in loop ottengo un errore 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' 
>>> 

Devo passare il percorso completo del file anche all'interno del ciclo?

+0

Stai cercando di attraversare un albero di directory, o sei interessato solo ai file regolari in una directory/cartella specifica? – Levon

+0

So che questa domanda ha quattro anni, ma non ha ancora una risposta accettata. – raoulcousins

risposta

24

Sì, è necessario il percorso completo.

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

È la soluzione rapida. Come il commento ha sottolineato, os.walk declina in sottodir quindi è necessario utilizzare la directory root corrente anziché indir come base per il join del percorso.

+5

'os.walk' scende in sottodirectory, quindi non dovresti usare' indir' qui. Usa 'root'. –

+1

buona cattura, aggiornato. – koblas

92

Se siete solo in cerca per i file in una singola directory (cioè sei non cercando di attraversare un albero di directory, che non sembra), perché non è sufficiente utilizzare os.listdir():

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

al posto di os.walk(). È possibile specificare un percorso di directory come parametro per os.listdir(). os.path.isfile() determinerà se il nome file specificato è per un file.

+0

il ciclo dell'OP non stampa solo i file in una directory. Stampa i file (in modo ricorsivo) in ogni directory anche sotto la directory di input. – mgilson

+0

@mgilson Mi manca quello guardando il codice dell'OP (OP si riferisce solo ai nomi dei file e non alle directory) e parte alla domanda "cartella con dieci file in essa che voglio scorrere". .. ho saltato alcune informazioni? – Levon

+0

Se l'OP ha la struttura della directory: '.' contiene' file1', 'directory1' e' directory1' contiene 'file2'. il codice dell'OP stamperà 'file1',' file2' mentre la vostra soluzione stamperebbe 'file1',' directory1'. (scusa, questo è davvero difficile da spiegare nei commenti). – mgilson

4

Gli esempi di os.walk in the documentation mostrano come fare questo:

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

Come ti aspettavi la funzione "aperta" per sapere che la stringa "1" dovrebbe significare "/ home/des/test/1 "(a meno che"/home/des/test "non sia la tua attuale directory di lavoro)?

4

Ecco un frammento di codice che vi guiderà la struttura dei file per voi:

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

È necessario specificare il percorso che si sta lavorando:

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') 
Problemi correlati