有没有一种方法可以浅复制现有文件对象?

ebo*_*yen 2 python

这样的用例是基于某个文件对象创建多个生成器,而其中任何一个都不践踏彼此的读取状态。

最初,我(认为我)使用了一个可行的实现seek()tell()并且每个生成器都由一个元生成器装饰,该生成器保持文件句柄的位置。这在诸如此类的事情上可以正常工作StringIO,但在实际文件上却失败了,因为预读缓冲区利用了offset

使用readline()或模拟真实文件对象是不可行的,因为这样做的原因是文件过大会首先提示生成器表达式。因此,丢失预读缓冲区并不是一个很好的选择(顺便说一句,为什么Python首先要以这种方式实现?缓冲区不应该像缓存一样,实际上并没有暴露给用户吗?应该进行适当的封装)tell()首先避免了此问题...)

然后copy.copy,我尝试使用,但结果如下:<closed file '<uninitialized file>', mode '<uninitialized file>' at 0x7f722ffda810>。似乎无法使用。

是否存在替代的复制方式?有没有办法初始化文件对象?还是应该完全放弃此用例,因为在Python中是不可能的?

che*_*ner 5

您正在寻找itertools.tee

from itertools import tee
with open("somefile.txt", "r") as fh:
    fh1, fh2, fh3 = tee(fh, 3)
Run Code Online (Sandbox Code Playgroud)

调用后tee,请勿再次使用父迭代器。但是,返回的迭代器tee可以自由和独立使用。

对于特定的文件对象(如保留特定于文件的方法read),您可以打开一个文件多次;每个文件对象在读取文件时都会维护自己的文件指针。

fh1, fh2, fh3 = [open("somefile.txt") for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

或者,如果您已经有一个文件对象fh

fh1, fh2, fh3 = [open(fh.name) for i in range(3)]
Run Code Online (Sandbox Code Playgroud)

这不会保留已经高级的文件指针,但是很容易跳转:

for x in fh1, fh2, fh3:
    x.seek(fh.tell())
Run Code Online (Sandbox Code Playgroud)