逐行读取大文件的gzip内容

1 投票
1 回答
2505 浏览
提问于 2025-04-18 04:29

我需要知道一个数字在一个有2912232966行的gzip文件中出现了多少次,我有以下代码:

import gzip
from itertools import islice

count=0
f = gzip.open(file,'rb') 
for line in f:
lin = line.decode('utf-8')
number = lin[:lin.index('\t')]
if number == '2719708':
  conunt+=1

但是我得到这个错误信息:

'CRC检查失败 0xabc8df68 != 0xba1760acL'

它只在行数达到400000000时有效,求助!

1 个回答

1

这是关于 zlib 的链接

引用自 jiffyclubs 的回答,详细内容可以在 这里 找到

gzip 模块的问题并不是它不能解压部分文件,而是在最后验证解压内容的校验和时会出错。因为原始的校验和是存储在压缩文件的末尾,所以对于部分文件来说,验证永远都不会成功。

关键在于让 gzip 跳过这个验证。caesar0301 的回答是通过修改 gzip 的源代码来实现的,但其实不需要这么复杂,简单的猴子补丁就可以了。我写了一个上下文管理器,临时替换 gzip.GzipFile._read_eof,这样我就可以解压部分文件了:

这看起来正是你需要的……

去那个链接看看完整的回答吧。


这是通过在谷歌上搜索“python gzip crc check failed”找到的 stackexchange 链接,结果是第一个。

撰写回答