【问题标题】:How to store many file handles so that we can close it at a later stage如何存储许多文件句柄以便我们可以在稍后阶段关闭它
【发布时间】:2012-04-11 18:19:42
【问题描述】:

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

【问题讨论】:

  • 你也许可以创建一个函数,而不是返回 foutList,而是每次使用 pythons yield 返回 fout。例如“让步”

标签: python file-handling


【解决方案1】:

我想不出任何理由说明这确实是邪恶的,但可能反对这样做的理由包括:

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

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

这就是说 - 为什么你想让一大堆文件保持打开状态以供写入?如果您间歇性地写入一堆文件,更好的方法是打开文件,写入,然后关闭它直到您准备好再次写入。 p>

您所要做的就是以 追加 模式打开文件 - open(filename,'a')。这使您可以写入现有文件的末尾而不会删除已经存在的文件(如'w' 模式。)


Edit(1) 我稍微误读了您的问题 - 我以为您想打开这些文件以写入,而不是阅读。保持一堆文件打开以供阅读并不是太糟糕。

如果您因为想要监视文件的更改而打开了文件,请尝试使用您的平台上相当于 Linux 的 inotify,它会告诉您何时文件已更改(无需您重复查看。)

【讨论】:

  • 感谢您的回复。好吧,我正在测试一个产品,我必须同时打开许多文件并在关闭它之前保持打开一段时间。此外,我有多次运行相同的程序来检查锁定过程。 with open(filename) as file_handle: 会在这种情况下提供服务吗??
  • 可能不会。如果您确实想打开一堆文件并保持它们全部打开,那么您的方法很好。
【解决方案2】:

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

如果你真的想手动关闭它们,使用弱引用来持有它们,不会阻止垃圾回收:http://docs.python.org/library/weakref.html

【讨论】:

  • 感谢您的回复,但是在这种情况下,我必须将所有弱引用存储在 List 或某种数组中,对吗??如果我错了,请纠正我。好吧,我也在稍后阶段关闭程序中的所有文件句柄,我只是想知道,将所有文件句柄存储在 List 中是一种糟糕的编程习惯吗?
  • @Gaara 将任何内容存储在列表中并没有什么不好。这就是列表的用途。唯一的问题是该列表是否适合这种情况。您没有提供任何表明该列表不合适的信息。我主要担心的是,也许您根本不应该存储文件句柄。
  • 好的,我可能会问这个问题,但是如果我不存储文件句柄,那么我将如何关闭打开的文件?就我而言,我必须将其保持打开一段时间然后关闭它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多