2

我有一个脚本来解压缩和解析包含在一堆非常大的 bzip2 压缩文件中的数据。由于这可能需要一段时间,我想有一些方法来监控进度。我知道我可以使用 获取文件大小os.path.getsize(),但会bz2.BZ2File.tell()返回未压缩数据中的位置。有什么方法可以获取未压缩文件中的当前位置,以便我可以监控进度?

如果有一个等效于 Java 的 python ,则可以加分ProgressMonitorInputStream

4

2 回答 2

0

如果您只需要解析bziped文件中的数据,我认为应该可以避免在阅读之前解压缩文件。我没有在 bzip 上测试过它,而是在 gziped 文件上测试过。我希望这也适用于 bziped 文件。

参见例如: 如何有效地在 python 中编写 csv?.

于 2013-03-22T23:03:51.320 回答
0

这是我想出的似乎可行的解决方案。

import bz2

class SimpleBZ2File(object):

    def __init__(self,path,readsize=1024):
        self.decomp = bz2.BZ2Decompressor()
        self.rawinput = open(path,'rb')
        self.eof = False
        self.readsize = readsize
        self.leftover = ''

    def tell(self):
        return self.rawinput.tell()

    def __iter__(self):
        while not self.eof:
            rawdata = self.rawinput.read(self.readsize)
            if rawdata == '':
                self.eof = True
            else:
                data = self.decomp.decompress(rawdata)
                if not data:
                    continue #we need to supply more raw to decompress
                newlines = list(data.splitlines(True))
                yield self.leftover + newlines[0]
                self.leftover = ''
                for l in newlines[1:-1]:
                    yield l
                if newlines[-1].endswith('\n'):
                    yield newlines[-1]
                else:
                    self.leftover = newlines[-1]
        if self.leftover:
            yield self.leftover
        self.rawinput.close()
于 2013-03-25T14:07:42.187 回答