我想在Python中从压缩流中读取数据时有一些进度指示器。我对从压缩流中读取的字节数感兴趣,而不是产生了多少解压缩数据。
我的程序如下:
#!/usr/bin/env python3
import lzma
filename = 'test.xz'
with lzma.open(filename, mode='rt') as f:
for ln, l in enumerate(f):
process(l)
if ln % 1000 == 0:
print('Read %d bytes from %s.' % (???, filename))
如何获取此信息?我已经尝试了f.tell()
,但却出错(OSError: telling position disabled by next() call
)。即使我通过明确使用f.readline()
来避免这种情况,报告的进度也会考虑未压缩的数据。
答案 0 :(得分:0)
事实证明,您所要做的就是使用f.fileno()
方法获取与压缩文件关联的文件描述符。然后,您可以使用os.fdopen()
使用它构造文件对象。唯一棘手的部分是设置closefd=False
,以便文件描述符仅由lzma库关闭一次。
#!/usr/bin/env python3
import lzma
import os
filename = 'test.xz'
with lzma.open(filename, mode='rt') as f:
fc = os.fdopen(f.fileno(), closefd=False)
for ln, l in enumerate(f):
process(l)
if ln % 1000 == 0:
print('Read %d bytes from %s.' % (fc.tell(), filename))