如果我打開函數中的文件:在函數中打開的文件不需要手動關閉?
In [108]: def foo(fname):
...: f=open(fname)
...: print f
...:
In [109]: foo('t.py')
<open file 't.py', mode 'r' at 0x05DA1B78>
是更好地手動或不關閉f
?爲什麼?
如果我打開函數中的文件:在函數中打開的文件不需要手動關閉?
In [108]: def foo(fname):
...: f=open(fname)
...: print f
...:
In [109]: foo('t.py')
<open file 't.py', mode 'r' at 0x05DA1B78>
是更好地手動或不關閉f
?爲什麼?
這是更好地關閉文件,當你用它做,因爲這是一個很好習慣,但並不完整因爲垃圾回收器會爲你關閉文件。你手動關閉它的原因是有更多的控制權。你不知道什麼時候垃圾收集器會運行。
但更好的是使用python 2.5中引入的with語句。
with open(f_name) as f:
# do stuff with f
# possibly throw an exception
這將關閉文件,無論在with語句的範圍內發生了什麼。
是的,最好是在處理文件時手動關閉文件或更好地使用with
語句(即使發生異常,它也會自動關閉文件)。在CPython中,當垃圾收集器實際上銷燬文件對象時,未引用的文件對象對象將自動關閉,直到此時任何未刷新的數據/資源仍可能在內存中停留。
從docs:
它與文件打交道 對象時使用的與關鍵字很好的做法。這具有如下優點:在 其套件結束後,即使在路上引發異常,該文件也能正確關閉。
相關:
$ cat /proc/sys/fs/file-max
390957
這可能會打破我的系統(原諒我沒有嘗試:)):
fs = []
for i in range(390957+1):
fs.append(open(str(i), 'w'))
for f in files:
f.close()
這個(希望)不會:
for i in range(390957+1):
with open(str(i), 'w') as f:
# do stuff