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