2013-06-03 66 views
1

是我還是打開或關閉python中的文件使用不同的方法使它真的不直觀? 有沒有更好的方法來做到這一點?Python打開和關閉文件 - 不直觀

例如:

f = open('file.txt', 'r') 
try: 
# do stuff with f 
finally: 
    f.close() 

現在,爲什麼我用的是內置的「功能」開放,但關閉該文件我沒有功能「關閉」,但我不得不稱之爲「對象」的方法「關」。

+0

open'的'覺得作爲一個構造函數(在Python 2.x中,它是一個近的同義詞'file'型)。 – chepner

回答

6

使用with關鍵字,使其更有點直觀。它會在你縮進時自動關閉文件。從文檔:

'with'語句闡明瞭以前將使用try ... finally塊以確保執行清理代碼的代碼。

...

這一說法已被執行之後,在F中的文件對象將被自動關閉,即使在for循環提出通過大宗例外兼職方式。

一個例子:

with open('file.txt', 'r') as f: 
    # do stuff with f 

# Do some other stuff - we dropped down a level of indentation, so the file is closed 

更具體地,最初將調用上下文的__enter__方法 - 這確實初始文件開口。無論是由__enter__返回的是使用as語句設置 - 在這種情況下,該文件返回self,它將被設置爲f。當with塊完成時,它將調用上下文的__exit__方法。對於文件上下文,這會執行關閉文件的正常finally塊處理。

請注意,with塊不會爲您處理例外情況,它只是確保__exit__被調用(並且會優雅地關閉文件),即使它們發生了。因此,如果您在使用該文件時有ValueError,則仍需要在塊內部有try...catch塊來處理對計算/腳本等可能做的任何操作。


如馬辛指出,大多數語言做到這一點的try...catch...finally塊。 Java中,例如,做到這一點:

BufferedReader reader = null; 
try { 
    reader = new BufferedReader(new File("file.txt")); 
    // Read in data and do stuff 
} catch (Exception e) { 
    // Shouldn't be this generic, but you get the idea 
    e.printStackTrace(); 
} finally { 
    // Always executes 
    if (reader != null) reader.close(); 
} 
+1

我想補充說try/catch方式在大多數其他語言中都是很常見的,這些語言都有異常處理。 – Marcin

+0

@Marcin現在就像最後一點那樣? – thegrinner

+0

是的,就像那樣。 – Marcin

2

這確實是相同的:

with open('file.txt', 'r') as f: 
    # do stuff