2012-05-17 133 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