0

我有 csv 读者和作家。我了解您必须打开和关闭底层对象。一种方法是首先创建文件对象 f,使用 csv 阅读器,然后使用 f.close()。

但是,我似乎无法执行以下操作:

with open(outputpath) as f_outputfile:

    outputfile = csv.writer(f_outputfile)

OTHER CODE HERE

我想做的是一次打开一堆阅读器和一堆作者,然后让它们都自动关闭。但是,这是否意味着我有一个嵌套的“With”块?

4

2 回答 2

5

写作:

with open(outputpath) as f_outputfile:
    outputfile = csv.writer(f_outputfile)

OTHER CODE HERE

本质上是一样的:

f_outputfile = open(outputpath)
try:
    outputfile = csv.writer(f_outputfile)
finally:
    f_outputfile.close() 

OTHER CODE HERE

如果OTHER CODE HERE依赖于打开的文件,它将无法正常工作。

于 2012-05-17T19:27:04.193 回答
3

您可以在with 语句中堆叠多个项目,如下所示(看起来这是 2.7.x 及更高版本的功能):

with open(foo) as f_foo, open(bar) as f_bar:
    # do something

7.5。with 语句

2.5 版中的新功能。

with 语句用于使用上下文管理器定义的方法包装块的执行(请参阅 With Statement Context Managers 部分)。这允许封装常见的 try...except...finally 使用模式以方便重用。

with_stmt ::=  "with" with_item ("," with_item)* ":" suite
with_item ::=  expression ["as" target]
于 2012-05-17T19:24:31.863 回答