我有一个脚本来解压缩和解析一堆非常大的bzip2压缩文件中包含的数据。由于可能需要一段时间,我想有一些方法来监控进度。我知道我可以使用os.path.getsize()
获取文件大小,但bz2.BZ2File.tell()
会返回未压缩数据中的位置。有没有办法在未压缩文件中获取当前位置,以便我可以监控进度?
如果有一个python等同于Java的ProgressMonitorInputStream
。
答案 0 :(得分:0)
如果你只需要解析bziped文件中的数据,我认为应该可以避免在读取之前解压缩文件。我没有在bzip上测试它,但是在gziped文件上测试过。我希望这也可以用bziped文件。
答案 1 :(得分: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()