在python中,同时打开同一文件上的多个文件句柄是可以接受的做法吗?

在python中,同时打开同一文件上的多个文件句柄是可以接受的做法吗?,python,io,Python,Io,例如: 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 如果没有,原因是什么?是的,我这

例如:

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

如果没有,原因是什么?

是的,我这样做是为了在多个线程中读取同一个文件,效果很好。但是,如果您试图提高速度,很可能无论如何都会受到i/o限制。

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

为了修改文件,最好不要尝试(对MartijnPieters的评论)

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

您可以在一个文件上打开多个文件句柄,是的。考虑到一个对象上的读取缓冲区可能看不到通过另一个对象写入的更改,这并不比使用任何其他语言的读取缓冲区好或坏。它有点不雅观,并且消耗了少量额外的内核资源,但是如果它使您的问题更容易解决,那么这是一件完全可以接受的事情。如果您理解正在处理的文件对象的缓冲语义,那么修改文件并不是简单的失败。Python 3
io
库使这些语义非常清晰易懂。@MartijnPieters您能在回答中详细说明“文件对象的语义”吗?@qed:如果您了解Python 3 I/O(或在Python 2中使用
io.open()
)使用的是a,那么您也知道读取会填充缓冲区。写入磁盘同样使用缓冲区。如果文件内容发生更改,内存缓冲区可能会不同步。