2012-06-25 3 views
21
import Image 
import os 
for dirname, dirs, files in os.walk("."): 
    for filename in files: 
     try: 
      im = Image.open(os.path.join(dirname,filename)) 
     except IOError: 
      print "error opening file :: " + os.path.join(dirname,filename) 
     print im.size 

Qui sto cercando di stampare la dimensione di tutti i file in una directory (e sotto). Ma so che lo im è fuori dall'ambito quando si trova nella riga im.size. Ma in quale altro modo lo faccio senza usare i blocchi else o finally. è mostratoAmbito variabile e Try Catch in python

il seguente errore:

Traceback (most recent call last): 
    File "batch.py", line 13, in <module> 
    print im.size 
NameError: name 'im' is not defined 
+27

'ambito di im' * non * è limitato alla' try' blocco; questo non è C++. – cdhowie

+0

@cdhowie: in tal caso, perché l'errore sopra riportato? – shahalpk

+12

L'errore è mostrato perché la variabile 'im' non è definita correttamente se' Image.open' fallisce quindi non esiste quando si prova ad accedere all'attributo '.size'. –

risposta

20

Cosa c'è che non va nella clausola "else"?

for filename in files: 
    try: 
     im = Image.open(os.path.join(dirname,filename)) 
    except IOError, e: 
     print "error opening file :: %s : %s" % (os.path.join(dirname,filename), e) 
    else: 
     print im.size 

Ora visto che sei in un ciclo, è anche possibile utilizzare un "continua" dichiarazione:

for filename in files: 
    try: 
     im = Image.open(os.path.join(dirname,filename)) 
    except IOError, e: 
     print "error opening file :: %s : %s" % (os.path.join(dirname,filename), e) 
     continue 

    print im.size 
2
import Image 
import os 
for dirname,dirs,files in os.walk("."): 
    for filename in files: 
     try: 
      im = Image.open(os.path.join(dirname,filename)) 
      print im.size 
     except IOError: 
      print "error opening file :: " + os.path.join(dirname,filename) 

Inoltre, non ; in Python.

+0

voglio codice ulteriormente, ma non lo voglio all'interno del blocco try. qualche idea? – shahalpk

+2

@ShahalTharique Il problema è che il blocco 'except' non si dirama da qualche parte, quindi viene eseguito e quindi l'istruzione' print' lo fa. Poiché l'eccezione è stata lanciata, 'im' non è mai stata assegnata. Devi gestire l'errore andando all'elemento successivo ('continue') o lasciando il ciclo' for' ('break'). – cdhowie

+0

@Burhan tat ha senso. Grazie. – shahalpk

3

Se non è possibile aprire il file come immagine e si desidera lavorare solo su immagini valide, includere un'istruzione continue nel proprio blocco tranne che vi porterà alla successiva iterazione del ciclo for.

try: 
    im = Image.open(os.path.join(dirname, filename)) 
except IOError: 
    print 'error opening file :: ' + os.path.join(dirname, filename) 
    continue 
+0

tatuaggi non è la mia domanda. ma devo dirti che funziona anche senza la dichiarazione 'continue'. – shahalpk

+1

@ShahalTharique La tua domanda è viziata, perché presumi che l'ambito di 'im' sia limitato al blocco try, quando in realtà non lo è. – cdhowie

+1

Il 'continue' è lì in modo che se non hai aperto con successo l'immagine continuerà al prossimo file nel tuo ciclo for poiché non avrai un oggetto chiamato' im' creato e quindi non avrà accesso ai suoi attributi e metodi. –