如何存储多个文件句柄,以便我们在稍后阶段关闭它



我用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

有些人建议我不要将其存储在列表中,但没有告诉我原因。有人能解释一下为什么不建议将其存储在列表中,以及其他可能的方法吗?

我想不出为什么这真的很邪恶,但可能的反对意见包括:

  1. 很难保证完成后每个文件句柄都会被关闭。将文件句柄与上下文管理器一起使用(请参阅with open(filename) as file_handle:语法)始终可以确保文件句柄是关闭的,即使出现问题也是如此。

  2. 如果你要长时间打开很多文件,而另一个程序正试图访问这些文件,那么同时打开这些文件可能是不礼貌的。

这就说明了-为什么你想保留一大堆文件以供写作?如果你间歇性地向一堆文件写入,一个更好的方法是打开文件,向它写入,然后关闭它,直到你准备好再次写入

您所要做的就是以append模式打开文件-open(filename,'a')。这使您可以在不擦除现有文件(如'w'模式)的情况下写入现有文件的末尾


编辑(1)我有点误解了你的问题——我以为你想打开这些文件是为了写作,而不是阅读。打开一堆文件阅读也不错。

如果您打开文件是因为您想监视文件的更改,请尝试使用您的平台等效的Linux的inotify,它将告诉文件何时更改(而不必重复查看)

如果根本不存储它们,它们最终将被垃圾收集,从而关闭它们。

如果您真的想手动关闭它们,请使用弱引用来保存它们,这不会阻止垃圾收集:http://docs.python.org/library/weakref.html

最新更新