Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的变量作用域和Try Catch_Python_Variables_Try Catch_Scope_Python Imaging Library - Fatal编程技术网

python中的变量作用域和Try Catch

python中的变量作用域和Try Catch,python,variables,try-catch,scope,python-imaging-library,Python,Variables,Try Catch,Scope,Python Imaging Library,在这里,我试图打印一个目录(和子目录)中所有文件的大小。但是我知道当在im.size行中时,im超出了范围。但是,如果不使用else或finally块,我怎么做呢 显示以下错误: import Image import os for dirname, dirs, files in os.walk("."): for filename in files: try: im = Image.open(os.path.join(dirname,filena

在这里,我试图打印一个目录(和子目录)中所有文件的大小。但是我知道当在
im.size
行中时,
im
超出了范围。但是,如果不使用
else
finally
块,我怎么做呢

显示以下错误:

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
回溯(最近一次呼叫最后一次):
文件“batch.py”,第13行,在
打印即时消息大小
NameError:未定义名称“im”

另外,没有

如果无法将文件作为图像打开,并且只想处理有效的图像,则在except块中包含一条语句,该语句将引导您进入
for
循环的下一次迭代

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)
“其他”条款有什么问题

现在,由于您处于循环中,还可以使用“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)
    else:
        print im.size

im
的范围不限于
try
块;这不是C++。@ CDHOWIE:在这种情况下,为什么会出现上述错误?由于变量<>代码> im >代码>,如果<>代码>图像未成功定义,则显示错误。如果在
for
循环的第一次迭代中抛出异常,
im
将尚未被分配,因此将不存在。您需要添加
continue
,以便通过在下一个项目上重复循环来处理错误。或者在
try
块中分配
im.size
后立即将其放入
try
块。我想进一步编码,但不想将其放入try块中。有什么想法吗?@ShahalTharique问题是你的
except
块没有分支,所以它执行,然后
print
语句执行。由于引发了异常,
im
从未分配给。您需要通过转到下一项(
continue
)或离开
for
循环(
break
)-1来处理错误,因为在
try
中写入的代码超过了最小数量可能会掩盖错误。这不是我的问题。但我得告诉你,即使没有
continue
语句,它也能工作。@ShahalTharique你的问题是有缺陷的,因为你假设
im
的范围仅限于
try
块,实际上它不是。
continue
存在,因此如果您没有成功打开图像,它将继续到for循环中的下一个文件,因为您将不会创建名为
im
的对象,因此将无法访问其属性和方法。
try:
    im = Image.open(os.path.join(dirname, filename))
except IOError:
    print 'error opening file :: ' + os.path.join(dirname, filename)
    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)
    else:
        print im.size
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