如何存储许多文件句柄,以便我们可以在以后关闭它

时间:2012-03-28 07:11:47

标签: python file-handling

我在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中以及另外可能的方法是什么?

2 个答案:

答案 0 :(得分:3)

我想不出为什么这真的是邪恶的任何原因,但可能反对这样做可能包括:

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

  2. 如果要让它们长时间打开,同时保持大量文件同时打开可能是不礼貌的,而另一个程序正在尝试访问这些文件。

  3. 这说 - 为什么你想保持一大堆文件开放写作?如果您间歇性地写入一堆文件,更好的方法是打开文件,写入文件,然后将其关闭,直到您准备再次写入。

    您只需在追加模式 - open(filename,'a')中打开文件即可。这使您可以在不删除已存在的文件的情况下写入现有文件的末尾(例如'w'模式。)


    编辑(1)我有点误读你的问题 - 我以为你想打开这些文件来,而不是阅读。保持一堆文件可供阅读并不算太糟糕。

    如果您打开文件是因为您想监控文件的更改,请尝试使用您的平台等同于Linux的inotify,这将告诉您当文件发生变化时(无需重复查看)。

答案 1 :(得分:1)

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

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