我使用以下代码读取 csv 文件
f = csv.reader(open(filename, 'rb'))
那我就没办法关闭了filename
,对吧?这样做有什么害处还是有更好的阅读方式?
有,使用上下文管理器:
with open(filename, 'rb') as handle:
f = csv.reader(handle)
通常,打开的未使用文件描述符是资源泄漏,应该避免。
有趣的是,在文件的情况下,至少文件描述符被释放,只要不再引用文件(另见这个答案):
#!/usr/bin/env python
import gc
import os
import subprocess
# GC thresholds (http://docs.python.org/3/library/gc.html#gc.set_threshold)
print "Garbage collection thresholds: {}".format(gc.get_threshold())
if __name__ == '__main__':
pid = os.getpid()
print('------- No file descriptor ...')
subprocess.call(['lsof -p %s' % pid], shell=True)
x = open('/tmp/test', 'w')
print('------- Reference to a file ...')
subprocess.call(['lsof -p %s' % pid], shell=True)
x = 2
print('------- FD is freed automatically w/o GC')
subprocess.call(['lsof -p %s' % pid], shell=True)