友
我试图用try / except块打开一个文件。
try:
with open(finput[1], "r") as f:
for line in f:
if "NQ" in line[:2]:
nq = int(line[-3:].strip())
except EnvironmentError:
print(("Oops! File \"{:s}\" does not exist!").format(f))
# print(("Oops! File \"{:s}\" does not exist!").format(finput[1]))
sys.exit(0)
当我使用finput[1]
时(即现在已注释),它工作正常并按预期提供文件名。
但是如果我使用f
(因为我尝试将文件finput[1]
打开为f
),它会给我错误:
Traceback(最近一次调用最后一次):
文件" readspr.py",第30行,in
print(("糟糕!文件\" {:s} \"不存在!")。format(f))
NameError:name' f'未定义
我对python没有多少经验(只知道编码,但不知道它是如何工作的。)。
所以,我对此的解释是:
因为,当f
打开文件失败时,f
中没有任何内容存储;因此它是未定义的。
但是,另一方面,看起来,python会尝试将文件打开为f
,因此finput[1]
中的任何内容都被赋予f
作为变量字符串并且python无法打开文件f
。
我不确定这是怎么回事。我尝试从互联网上的许多部分(即7.2.1 of this,the accepted answer here等)中理解它,但只是找到了我用它的内容:simplifying exception handling
。
如果你能解释为什么不将f
视为例外,那将对我有所帮助。
答案 0 :(得分:2)
问题实际上不是范围之一(参见Variable defined with with-statement available outside of with-block?)。问题是如果在open
内发生异常,则永远不会执行as f
语句,因此尚未定义f
。如果失败发生在 with
块内,那么f
仍然是有效的参考。
换句话说,这里的with
陈述并没有什么特别之处。您的特定情况在语义上等同于尝试执行以下操作:
try:
f = open(filename)
except EnvironmentError:
# Trying to use f here is invalid, since it was never defined if open failed