2013-03-04 16 views
6

Sto provando a scrivere un gestore che agisce su file all'interno di varie sottodirectory, ma mentre il mio script può vedere questi file, non può fare nulla con loro perché non riesce a assemblare i loro percorsi.Uso corretto di os.path e os.join

La parte problematica viene da questo ciclo:

for (path, dirs, files) in os.walk("data/"): 
    for image in files: 
     #do something to the image 

Ora, lo script funziona nel primo livello della directory data, ma non riesce a lavorare sulla sottodirectory data s'.

Ho provato ad utilizzare os.path.join():

for (path, dirs, files) in os.walk("data/"): 
    print os.path.join(path, dirs) 

Ma che getta il seguente:

Traceback (most recent call last): 
    File "bench.py", line 26, in <module> 
    print os.path.join(path, dirs) 
    File "/usr/lib/python2.7/posixpath.py", line 75, in join 
    if b.startswith('/'): 
AttributeError: 'list' object has no attribute 'startswith' 

In breve, quello che mi piacerebbe fare è assemblare un percorso dal data all'immagine che comprende data sottodirectory. Qual è la migliore pratica per farlo?

+2

Quando si ottiene un'eccezione di questo tipo, è spesso perché si sta tentando di fare qualcosa su un elenco di valori come 'dirs', anziché su ogni valore. (Se non ti rendi conto che 'dirs' è una lista, l'eccezione dovrebbe sollevare questa possibilità come una bandiera rossa, e puoi provare' print dirs' o 'print type (dirs)' per scoprirlo.) Puoi risolvere questo usando un ciclo 'for', una list comprehension,' map', ecc., come mostra la risposta di mgilson, una volta riconosciuto che è ciò che stai cercando di fare. – abarnert

risposta

7

Penso che si desidera partecipare path con file per ogni file in files

for path,dirs,files in os.walk('data/'): 
    for f in files: 
     fname = os.path.join(path,f) 
     assert(os.path.exists(fname)) 

dirs è un list di directory che si trovano nella directory path. È possibile modificare in realtà dirs per impedire a os.walk di entrare in determinate directory (ordinate!).

+0

@StevenRumbalski - Sì. È corretto. Grazie per il chiarimento. (Ho modificato, spero di evitare qualsiasi confusione) – mgilson

+0

+1. E ovviamente puoi anche "unire" 'path' con ogni' dir' in 'dirs', se devi fare qualcosa con le sottodirectory (oltre a vedere i loro nomi o sfoltire la lista). – abarnert

1

Prova:

for (path, dirs, files) in os.walk("data/"): 
    for image in files: 
    fname = os.path.join(path, image) 
    file = open(fname, 'rb') 

I due esempi al os.walk documentation sia fare proprio questa cosa.

0
for (path, dirs, files) in os.walk("data/"): 
    for image in files: 
    file_path = os.path.join(path, image) 
    # do your stuff