我用python编写了一个小程序,需要打开许多文件并在稍后阶段关闭它,我将所有文件句柄存储在一个列表中,以便稍后可以引用它进行关闭。
在我的程序中,我将所有文件句柄(fout)存储在列表foutList[]中
for cnt in range(count):
fileName = "file" + `cnt` + ".txt"
fullFileName = path + fileName
print "opening file " + fullFileName
try:
fout = open(fullFileName,"r")
foutList.append(fout)
except IOError as e:
print "Cannot open file: %s" % e.strerror
break
有些人建议我不要将其存储在列表中,但没有告诉我原因。有人能解释一下为什么不建议将其存储在列表中,以及其他可能的方法吗?
我想不出为什么这真的很邪恶,但可能的反对意见包括:
-
很难保证完成后每个文件句柄都会被关闭。将文件句柄与上下文管理器一起使用(请参阅
with open(filename) as file_handle:
语法)始终可以确保文件句柄是关闭的,即使出现问题也是如此。 -
如果你要长时间打开很多文件,而另一个程序正试图访问这些文件,那么同时打开这些文件可能是不礼貌的。
这就说明了-为什么你想保留一大堆文件以供写作?如果你间歇性地向一堆文件写入,一个更好的方法是打开文件,向它写入,然后关闭它,直到你准备好再次写入
您所要做的就是以append模式打开文件-open(filename,'a')
。这使您可以在不擦除现有文件(如'w'
模式)的情况下写入现有文件的末尾
编辑(1)我有点误解了你的问题——我以为你想打开这些文件是为了写作,而不是阅读。打开一堆文件阅读也不错。
如果您打开文件是因为您想监视文件的更改,请尝试使用您的平台等效的Linux的inotify
,它将告诉文件何时更改(而不必重复查看)
如果根本不存储它们,它们最终将被垃圾收集,从而关闭它们。
如果您真的想手动关闭它们,请使用弱引用来保存它们,这不会阻止垃圾收集:http://docs.python.org/library/weakref.html