python - 以与 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进度条)
解决方案
未压缩的输入大小存储在最后 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" )
推荐阅读
- swiftui - SwiftUI AppDelegate didRegisterForRemoteNotificationsWithDeviceToken 从未调用
- adobe-documentgeneration - $formatNumber 在表数组中使用时输出 NaN
- php - 如何检查文件名,如果存在,则添加计数器
- javascript - 使用 JavaScript 和 jQuery 对 div 中的输入和返回值求和
- python - 我无法安装任何 python 包
- r - Dplyr:如何匹配来自多列的值?
- git - 在每个环境中使用分支时避免冲突的分支流程应该是什么
- functional-programming - 在 fp-ts 中分支和合并
- android - 如何在android Jetpack Compose中删除文本?
- spring-boot - 使用 loader.path 将外部 jar 绑定到 SpringBootApplication