gpt4 book ai didi

python - 有没有办法浅复制现有的文件对象?

转载 作者:行者123 更新时间:2023-11-28 21:53:27 25 4
gpt4 key购买 nike

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

最初我(以为我)有一个使用 seek() 的工作实现和 tell()其中每个生成器都由一个维护文件句柄位置的元生成器装饰。这在 StringIO 之类的事情上效果很好, 但由于预读缓冲区破坏了 offset 而在真实文件上失败.

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

然后我尝试使用 copy.copy ,但这会导致类似这样的结果:<closed file '<uninitialized file>', mode '<uninitialized file>' at 0x7f722ffda810> .这似乎无法使用。

是否存在其他复制方式?有没有办法初始化文件对象?或者我应该完全放弃这个用例,因为它在 Python 中是不可能的吗?

最佳答案

您正在寻找 itertools.tee

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

调用tee 后,不要再次使用父迭代器。但是,从 tee 返回的迭代器可以自由独立地使用。

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

fh1, fh2, fh3 = [open("somefile.txt") for i in range(3)]

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

fh1, fh2, fh3 = [open(fh.name) for i in range(3)]

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

for x in fh1, fh2, fh3:
x.seek(fh.tell())

关于python - 有没有办法浅复制现有的文件对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26367423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com