我在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
有些人建议我不要把它存放在List中,但没有告诉我原因。任何人都可以解释为什么不建议将它存储在List中以及另外可能的方法是什么?
答案 0 :(得分:3)
我想不出为什么这真的是邪恶的任何原因,但可能反对这样做可能包括:
很难保证在完成后关闭每个文件句柄。将文件句柄与上下文管理器一起使用(请参阅with open(filename) as file_handle:
语法)始终保证文件句柄已关闭,即使出现问题也是如此。
如果要让它们长时间打开,同时保持大量文件同时打开可能是不礼貌的,而另一个程序正在尝试访问这些文件。
这说 - 为什么你想保持一大堆文件开放写作?如果您间歇性地写入一堆文件,更好的方法是打开文件,写入文件,然后将其关闭,直到您准备再次写入。
您只需在追加模式 - open(filename,'a')
中打开文件即可。这使您可以在不删除已存在的文件的情况下写入现有文件的末尾(例如'w'
模式。)
编辑(1)我有点误读你的问题 - 我以为你想打开这些文件来写,而不是阅读。保持一堆文件可供阅读并不算太糟糕。
如果您打开文件是因为您想监控文件的更改,请尝试使用您的平台等同于Linux的inotify
,这将告诉您当文件发生变化时(无需重复查看)。
答案 1 :(得分:1)
如果你根本不存储它们,它们最终将被垃圾收集,这将关闭它们。
如果您确实想要手动关闭它们,请使用弱引用来保存它们,这不会阻止垃圾回收:http://docs.python.org/library/weakref.html