2

我有一个 python 脚本,它读取一个 .csv 文件,该文件适用于 Python 2.7,但在 Python 2.4 上运行良好。抛出的错误在线

with open(sys.argv[1], 'rb') as csvfile:

就在这里,它给了我一个语法错误,所以我的问题是“with”做了什么(或者这其中的任何部分都可能在 2.4 中引发语法错误)。我在任何地方都找不到有关此功能的文档,部分原因是它的通用名称。

4

2 回答 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无论发生什么其他事情都正确关闭。

于 2013-06-27T21:40:09.717 回答
1

在打开文件的具体情况下,实现如下:

cvsfile = open(sys.argv[1], 'rb')
try:
   ...
finally:
    cvsfile.close()

withPython 2.5 及更高版本允许在(上下文管理器)中用作表达式的对象定义它们如何进入和离开上下文。离开时文件将被关闭with,锁将被解锁,等等。

介绍的PEP 343with仍然是一本内容丰富的读物。

于 2013-06-27T21:35:15.757 回答