【问题标题】:Is opening multiple file handles on the same file at the same time a acceptable practice in python?在 python 中同时打开同一个文件的多个文件句柄是可接受的做法吗?
【发布时间】:2014-05-29 21:52:06
【问题描述】:

例如:

bedpath = "/tmp/bedtest"
with open(bedpath, "rb") as fh1, open(bedpath, "rb") as fh2:
    fh1.seek(3)
    fh2.seek(5)
    for i in range(3):
        b1 = fh1.read(1)
        b2 = fh2.read(1)
        # do something with b1 and b2

如果不是,为什么?

【问题讨论】:

  • 您可以在一个文件上打开多个文件句柄,是的。考虑到一个对象上的读取缓冲区可能看不到通过另一个对象写入的更改。
  • 这并不比使用任何其他语言更好或更差。它有点不优雅,并且会消耗少量额外的内核资源,但如果它能让您的问题更容易解决,这是完全可以接受的。

标签: python io


【解决方案1】:

是的,我这样做是为了在多个线程中读取同一个文件,它工作正常。但是,如果您想提高速度,那么您很可能会受到 i/o 限制。

【讨论】:

    【解决方案2】:

    对于读取文件,这是可以接受的,尤其是当您需要多个查找位置时。

    为了修改文件 - 最好不要尝试(cmets 对 MartijnPieters 做出反应)。

    • 初学者(不是指你)经常尝试同时读取和修改文件,不明白,文本行不是文件在磁盘上的存储方式。这就是我所说的简单失败。
    • 您可以尝试在读取文件时修改文件或从多个文件描述符中修改文件。但这是相当复杂的,而且大多数情况下都可以通过一些东西来避免,这比理解和维护简单几个数量级。

    【讨论】:

    • 如果您了解正在使用的文件对象的缓冲语义,那么修改文件不是简单的失败。 Python 3 io 库使这些语义非常清晰且易于访问。
    • @MartijnPieters 您能否详细说明“文件对象的语义”作为答案?
    • @qed:如果您了解 Python 3 I/O(或在 Python 2 中使用 io.open())使用 BufferedIOBase derived object,那么您也知道读取会填充缓冲区。写入磁盘同样使用缓冲区。如果文件内容发生变化,内存缓冲区可能会不同步。
    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多