首页 > 解决方案 > 以与 gunzip 一样快的速度获取 gzip 解压缩文件大小(无查找)

问题描述

正如一些 StackOverflow 答案所示,您可以使用decompressedSize = gzipFile.seek(0, io.SEEK_END). 有些人还建议对小于 4 GiB 的文件进行处理.seek(-4, 1)。但是,因为它一直在寻找文件直到最后,所以对于更大的文件非常耗时(对于大约 1 GiB 的解压缩数据,寻找到最后需要几秒钟)。

然后我尝试使用gunzip -l somefile.gz(相同文件),它设法立即输出当前文件大小以及解压缩时的文件大小。

我如何才能以gunzip更快的速度获得解压缩的 gzip 的文件大小?

(PS我试图获取解压后的gzip大小的原因是解压时的CLI进度条)

标签: pythonperformancecompressiongzipgunzip

解决方案


未压缩的输入大小存储在最后 4 个字节 [ 1 ] 中,因此开始的建议-4是正确的。

然而,问题是您的光标必须在第二个参数之前移动 4 个位置,因此,相对于文件末尾的 4 个位置,而不是当前位置。因此,1 (SEEK_CUR)应替换为2 (SEEK_END)

将位置设置到位后,您可以read()只使用最后 4 个字节,然后将它们转换为int[ 2 ];字节顺序是小端。

with open("yourfile", "rb") as f:
  # place the cursor in the right position
  f.seek(-4, 2)

  # get the size of uncompressed input from last 4 bytes
  size = int.from_bytes( f.read(), "little" )

推荐阅读