2012-05-17 79 views
0

我有两个csv读者和作家。我知道你必须打开和关闭底层对象。一种方法是先创建文件对象f,然后使用csv reader,然后使用f.close()。python“with”命令和csv阅读器

不过,我似乎无法做到以下几点:

with open(outputpath) as f_outputfile: 

    outputfile = csv.writer(f_outputfile) 

OTHER CODE HERE 

我想要做的就是打开一次一群读者,并在一次一堆作家,并自动把它们都关闭。但是,这是否意味着我有一个嵌套的“With”块?

+2

其他代码在这里使用'f_outputfile'吗? – Eric

+0

更合适的是,'OTHER CODE HERE'是写入csv文件的部分吗? – Josiah

+0

是的,它的确如此。假设我想要3位读者和2位作家,他们都需要对方。其他CODE HERE写入CSV文件。 – user1357015

回答

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依赖于该文件是开放的,它是行不通的。

+1

点这只是基本上相同,如果csv.writer不能抛出异常(这是从来没有真正的Python)。 – Falmarri

+0

@Falmarri:好点。 – Eric

3

可以叠加在with statement多个项目中(看起来这是一个2.7.x和更高的功能):

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

7.5。有声明

版本2.5中的新功能。

with语句用于使用上下文管理器定义的 方法将块的执行封装起来(请参见使用语句 上下文管理器的部分)。这允许通用的尝试...除了...最终使用 模式被封装以方便重用。

with_stmt ::= "with" with_item ("," with_item)* ":" suite 
with_item ::= expression ["as" target] 
+0

这引发了一个错误,不知道为什么然后: 与开放(输出路径,“W”)作为f_outputfile,打开(输入路径,“R”)作为f_inputpath: – user1357015

+0

只是验证它在2.7.3的作品,你是什么版本使用?只是看了一下2.6文档,它只允许单个with_item的这可能是一个3.x功能移植到2.7.x –

+0

我使用2.6.6,这一定是为什么。没关系,我可以做嵌套的“withs”。只是为了确定,我现在不需要担心关闭命令是吗?他们现在会自动关闭? – user1357015