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

标签 python

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

最初我(以为我)有一个使用 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/

相关文章:

Python Tornado Web 服务器 : How to use multiprocessing to speed up web application

python - sklearn 的评分函数的参数是什么?

python - 如何在 Flask 页面之间传递变量?

python - 基本 friend 时间轴算法?

python - 如何在QTextEdit中插入和清除占位符

Python SafeConfigParser 模拟

python - (python) 日期范围内的 "Passing Go"

python - 无法使用 Mechanize 登录

python - Groupby 当给定每个组的起始位置索引时

python - 在 flask python 中调用 POST 请求时无法解码 JSON 对象