首页 > 解决方案 > 当我尝试打开无效文件名时出现 UnboundLocalError

问题描述

我编写了一个程序,该程序采用文件名并返回数字,当文件名输入正确但当我尝试故意写入不正确的文件名时,它按预期工作,而不是给我一个“错误:找不到文件”例外,它会说:

def getFile(fileName):
lines = []
try:
    infile = open(fileName, 'r')
    if infile != None:
        for line in infile:
         lines.append(line)

except IOError:
    print('Error: file not found.')

finally:
    infile.close()
return lines

标签: pythonfile

解决方案


如果 引发异常open,则永远不会声明局部变量infile,更不用说分配了,因此infile.close()finally块中调用的尝试将引发UnboundLocalError如您在此处看到的那样。您可以通过声明infile一些特殊的未初始化值(例如None)并像这样显式检查来“修复”这个问题:

def getFile(fileName):
    lines = []
    infile = None
    try:
        infile = open(fileName, 'r')
        for line in infile:
            lines.append(line)
    except IOError:
        print('Error: file not found.')
    finally:
        if infile is not None:
            infile.close()
    return lines

或者,由于文件对象是上下文管理器,您可以编写如下内容:

def getFile(fileName):
    lines = []
    try:
        with open(fileName, 'r') as infile:
            for line in infile:
                lines.append(line)
    except IOError:
        print('Error: file not found.')
    return lines

...这将确保infile以更语法简洁和结构化的方式关闭。


请注意,失败时open会引发OSError(例如 a FileNotFoundError)而不是返回None,因此您现有的检查是多余的。

此外,IOError在迭代文件而不是最初打开文件时可能会引发 an ,因此在这些情况下打印的错误消息可能不正确。

最后,由于infile它是一个可迭代对象,因此您可以使用直接接受可迭代对象的构造函数轻松地从它迭代构造一个列表,如下所示:

return list(infile)

推荐阅读