是我還是打開或關閉python中的文件使用不同的方法使它真的不直觀? 有沒有更好的方法來做到這一點?Python打開和關閉文件 - 不直觀
例如:
f = open('file.txt', 'r')
try:
# do stuff with f
finally:
f.close()
現在,爲什麼我用的是內置的「功能」開放,但關閉該文件我沒有功能「關閉」,但我不得不稱之爲「對象」的方法「關」。
是我還是打開或關閉python中的文件使用不同的方法使它真的不直觀? 有沒有更好的方法來做到這一點?Python打開和關閉文件 - 不直觀
例如:
f = open('file.txt', 'r')
try:
# do stuff with f
finally:
f.close()
現在,爲什麼我用的是內置的「功能」開放,但關閉該文件我沒有功能「關閉」,但我不得不稱之爲「對象」的方法「關」。
使用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();
}
我想補充說try/catch方式在大多數其他語言中都是很常見的,這些語言都有異常處理。 – Marcin
@Marcin現在就像最後一點那樣? – thegrinner
是的,就像那樣。 – Marcin
這確實是相同的:
with open('file.txt', 'r') as f:
# do stuff
open'的'覺得作爲一個構造函數(在Python 2.x中,它是一個近的同義詞'file'型)。 – chepner