2013-03-22 81 views
1

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

如果存在与Java的ProgressMonitorInputStream等效的python,则可获得奖励积分。

回答

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() 
0

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

例如参见: How to write csv in python efficiently?

+0

我只对这些文件中的数据子集感兴趣,所以我不想完全解压缩它们。我在阅读这些文章时正在解析这些文章,并只输出了我所关心的部分。 – job 2013-03-23 02:21:40

+0

好吧,我以为你不想解压缩你的文件,然后解析它。似乎你已经以正确的方式去做了。 – Dvx 2013-03-23 09:58:06