Подтвердить что ты не робот

Область переменных и Try Catch в python

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

Здесь я пытаюсь напечатать размер всех файлов в каталоге (и под). Но я знаю, что im находится за пределами области действия, когда в строке im.size. Но как же я это делаю без использования блоков else или finally.

Отображается следующая ошибка:

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

Ответ 1

Что не так с предложением 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

Теперь, когда вы находитесь в цикле, вы также можете использовать оператор continue:

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

Если вы не можете открыть файл в качестве изображения и хотите работать только с действительными изображениями, включите continue в вашем исключающем блоке, который перенесет вас на следующую итерацию цикла for.

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

Ответ 3

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)

Кроме того, no ; в Python.