我有一个 python 脚本,它读取一个 .csv 文件,该文件适用于 Python 2.7,但在 Python 2.4 上运行良好。抛出的错误在线
with open(sys.argv[1], 'rb') as csvfile:
就在这里,它给了我一个语法错误,所以我的问题是“with”做了什么(或者这其中的任何部分都可能在 2.4 中引发语法错误)。我在任何地方都找不到有关此功能的文档,部分原因是它的通用名称。
您正在查看上下文管理器;查找更容易搜索的相关文档。
添加该功能的原始提案 PEP-343详细描述了上下文管理器。
数据模型文档描述了是什么构成了上下文管理器。上下文管理器有.__enter__()
和.__exit__()
方法。
该with
语句本身在参考文档中记录为复合语句。
对于文件对象,文件对象文档(标准类型文档的一部分)描述了大多数文件对象可以用作上下文管理器。
特别是对于文件,您要查找的相关部分使用file.close()
method进行记录,因为这是上下文管理器.__exit__()
方法对文件所做的事情:无论发生什么,都关闭文件。
将其转换为尚不支持该with
语句的较旧 Python 版本,这意味着您必须手动关闭文件,并使用以下try:
finally:
组合:
csvfile = open(sys.argv[1], 'rb')
try:
# do things with csvfile
finally:
csvfile.close()
这样可以确保csvfile
无论发生什么其他事情都正确关闭。
在打开文件的具体情况下,实现如下:
cvsfile = open(sys.argv[1], 'rb')
try:
...
finally:
cvsfile.close()
with
Python 2.5 及更高版本允许在(上下文管理器)中用作表达式的对象定义它们如何进入和离开上下文。离开时文件将被关闭with
,锁将被解锁,等等。
介绍的PEP 343with
仍然是一本内容丰富的读物。