2

非常に大きな bzip2 圧縮ファイルの束に含まれるデータを解凍して解析するためのスクリプトがあります。しばらく時間がかかる場合があるため、進行状況を監視する方法が必要です。でファイルサイズを取得できることは知ってos.path.getsize()いますがbz2.BZ2File.tell()、非圧縮データ内の位置を返します。進行状況を監視できるように、圧縮されていないファイル内の現在の位置を取得する方法はありますか?

Java の に相当する Python があればボーナスポイントProgressMonitorInputStream

4

2 に答える 2

0

bzipされたファイルのデータのみを解析する必要がある場合は、ファイルを読み取る前にファイルを解凍することを回避できるはずです。私はそれをbzipでテストしていませんが、gzipファイルでテストしました。これがbzipファイルでも可能であることを願っています。

たとえば 、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 に答える