- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此用例是基于某个文件对象创建多个生成器,而其中任何一个都不会破坏彼此的读取状态。
最初我(以为我)有一个使用 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/
我是一名优秀的程序员,十分优秀!