2013-03-22 2 views
1

У меня есть сценарий для распаковки и анализа данных, содержащихся в кучке очень больших сжатых файлов bzip2. Поскольку это может занять некоторое время, я хотел бы иметь какой-то способ контролировать прогресс. Я знаю, что могу получить размер файла с os.path.getsize(), но bz2.BZ2File.tell() возвращает позицию в несжатых данных. Есть ли способ получить текущую позицию в несжатом файле, чтобы я мог отслеживать прогресс?Как получить внутреннюю позицию при чтении файла bzip2

Бонусные баллы, если есть эквивалент python для Java ProgressMonitorInputStream.

ответ

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

+0

ok Я думал, что вы скорее распечатываете свой файл, а затем разбираете его. Кажется, вы уже делали это правильно. – Dvx