2012-06-25 20 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 

Aquí intento imprimir el tamaño de todos los archivos en un directorio (y sub). Pero sé que im está fuera del alcance cuando está en la línea im.size. Pero, ¿cómo lo hago sin usar los bloques else o finally? se muestraAlcance variable y Try Catch en python

el siguiente error:

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

'alcance de im' cuenta no es limitado a la' try' bloque; esto no es C++. – cdhowie

+0

@cdhowie: en ese caso, ¿por qué el error anterior? – shahalpk

+12

Se muestra el error porque la variable 'im' no se define correctamente si falla' Image.open', por lo que no existe cuando intenta acceder al atributo '.size'. –

Respuesta

20

¿Qué pasa con la cláusula "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 

Ahora ya que estás en un bucle, también se puede utilizar un "Continuar" declaración:

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) 

Además, no hay ; en Python.

+0

quiero codificar más, pero no lo quiero dentro del bloque try. ¿algunas ideas? – shahalpk

+2

@ ShahalTharique El problema es que su bloque 'except' no se bifurca en alguna parte, por lo que se ejecuta y luego la instrucción' print' lo hace. Desde que se lanzó la excepción, 'im' nunca se asignó a. Necesita manejar el error yendo al siguiente elemento ('continue') o dejando el bucle' for' ('break'). – cdhowie

+0

@Burhan tat tiene sentido. Gracias. – shahalpk

3

Si no puede abrir el archivo como una imagen, y solo desea trabajar con imágenes válidas, incluya una declaración continue en su bloque excepto que lo llevará a la siguiente iteración de su bucle for.

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

no es mi pregunta. pero tengo que decirte, funciona incluso sin la declaración 'continue'. – shahalpk

+1

@ ShahalTharique Su pregunta es errónea, porque supone que el alcance de 'im' está limitado al bloque' try', cuando en realidad no lo es. – cdhowie

+1

El 'continuar' está ahí, de modo que si no ha abierto correctamente la imagen, continuará al siguiente archivo en su ciclo for ya que no tendrá creado un objeto llamado' im' y, por lo tanto, no tendrá acceso a sus atributos y métodos. –