从压缩流中读取了多少字节?

时间:2018-02-14 16:21:42

标签: python python-3.x lzma

我想在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()来避免这种情况,报告的进度也会考虑未压缩的数据。

1 个答案:

答案 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))