问题
我有很多 gzip 压缩的文本文件,我想在运行中(运行中)解压缩和读取,以节省磁盘空间和从磁盘读取数据的时间,而不是在线解压缩所花费的时间。
所以我使用 gzip 模块和 tqdm 来跟踪进度。
但是,如何找出原始未压缩文件大小的大小,以便在完成跟踪进度之前设置读取(未压缩)的总字节数?就我在搜索网络时所关心的而言,对于大于 4gb 的文件,这个问题在 gzip 中很难解决,这就是我的情况。
或者,我应该跟踪读取的压缩字节并将总字节设置为压缩文件的大小。
我该怎么做?
下面是一个代码示例,其中的注释也反映了我想要实现的目标。
我正在使用 Python3.5。
- import gzip
- import tqdm
- import os
- size = os.path.getsize('filename.gz')
- pbar = tqdm.tqdm(total=size, unit='b', unit_scale=True, unit_divisor=1024)
- with gzip.open('filename.gz', 'rt') as file:
- for line in file:
- bytes_uncompressed = len(line.encode('utf-8'))
- # but how can I get compressed bytes read count?
- # bytes_compressed = ...?
- # pbar.update(bytes_compressed)
复制代码
回答
您应该打开以读取基础文件(以二进制模式) f = open('filename.gz', 'rb') 。然后打开上面的gzip文件。 g = gzip.GzipFile(fileobj=f) 。您可以从 g 读取,以了解您的距离,您可以请求 zip 文件中的位置。
EDIT2:顺便说一句。当然,您也可以在 f.tell() 实例上使用 tell() 来判断未压缩文件的长度(读取的字节数)。
编辑:现在我看到这只是您问题的部分答案。您还需要总数。恐怕你运气不好。尤其是您提到的 4GB+ 文件。 gzip 将未压缩的大小保留在最后四个字节中,因此您可以跳转到那里并读取它们并跳回(GzipFile 本身似乎不会公开此信息),但是由于它是四个字节,因此您只有 4GB可以存储为最大的数字,其余的将被截断为值的低 4B。那样的话,恐怕到最后你才知道。
总之,上面的提示为您提供了压缩和未压缩的当前位置,并希望让您至少在一定程度上实现您已经开始做的事情。
|