发生异常时open语句如何工作

时间:2015-02-15 00:39:06

标签: python-3.x

我试图用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 thisthe accepted answer here等)中理解它,但只是找到了我用它的内容:simplifying exception handling

如果你能解释为什么不将f视为例外,那将对我有所帮助。

1 个答案:

答案 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