python中的'with'函数有什么作用?

时间:2013-06-27 21:34:02

标签: python csv backport

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

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

就在这里,它给了我一个语法错误,所以我的问题是'与'做什么(或者这可能会导致2.4中的语法错误)。我无法在任何地方找到关于此功能的文档,部分原因在于它的通用名称。

2 个答案:

答案 0 :(得分:3)

您正在查看上下文管理器;相关文档,这是一个更容易搜索的术语。

  • 添加该功能的原始proposal PEP-343详细介绍了上下文管理器。

  • datamodel documentation描述了上下文管理器的用途。上下文管理员使用.__enter__().__exit__()方法。

  • with语句本身在参考文档中记录为compound statement

  • 对于文件对象,File object文档(标准类型文档的一部分)描述了大多数文件对象都可以用作上下文管理器。

具体来说,对于文件,您要查找的相关部分记录在file.close() method中,因为这是上下文管理器.__exit__()方法对文件的作用:关闭文件,无论发生了什么。

将其转换为尚未支持with语句的旧版Python,这意味着您必须使用try: finally:组合手动关闭文件:

csvfile = open(sys.argv[1], 'rb')
try:

    # do things with csvfile

finally:
    csvfile.close()

这确保csvfile在发生任何其他事件时正确关闭。

答案 1 :(得分:1)

在打开文件的具体情况下,它实现了以下目的:

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

Python 2.5及更高版本允许在with上下文管理器)中用作表达式的对象来定义它们如何进入上下文并保留它。离开with时文件将被关闭,锁将被解锁,依此类推。

引入with

PEP 343仍然是一个信息丰富的读物。