python - 当我尝试打开无效文件名时出现 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
解决方案
如果 引发异常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)
推荐阅读
- matlab - 在 MATLAB 中获取图的给定路径的权重
- mysql - 有没有办法计算 SQL 中多列中唯一值的数量
- angular - primeNG p-multiSelect 与模板驱动形式,动态选项
- node.js - 开玩笑测试运行返回错误作为 TCPSERVERWRAP 错误
- project-reactor - 用于简单 RESTful 调用的反应式 R2DBC
- r - 使用函数 clusterR 的并行化过程出错:集群错误
- java - 如何在 Spring 上测试 CSRF 保护?
- sql - HIVE 布尔过滤器
- python - 如何在 Django REST 框架中为多对多字段定义“IsOwner”自定义权限?
- github - 将代码从 GitHub 复制到 GitLab - 代码被复制到不同的位置