当CRC检查失败时如何强制GZIP读取文件

发布于 2025-01-13 23:28:54 字数 448 浏览 0 评论 0原文

我正在使用 gzip 模块在 Python 中读取一堆 gzip 压缩文件。不幸的是,其中一些未通过 CRC 检查,因此我正在寻找解决此问题的方法。环顾 StackOverflow,我发现了一些非常古老(2009 年)的答案,并且没有代码示例,因此看起来基本上可以使用底层 zlib 库忽略 CRC 检查,但我不知道如何实际操作。 这是我的代码的简单版本:

def check():
    filenames = ['myfile_1.csv.gz', 'myfile_2.csv.gz']
    for name in filenames:
        data = gzip.open(name, 'r')
        for row in data.read().splitlines():
            # do stuff
            pass
        data.close()

I'm reading a bunch of gzip compressed files in Python using the gzip module. Unfortunately some of them fail the CRC check, so I'm looking for ways to go around this problem. Looking around StackOverflow I found some very old (2009) answers to this, and without code examples, so it looks like it's possible to basically ignore the CRC check using the underlying zlib library, but I can't figure out how to do it practically.
This is a simple version of my code:

def check():
    filenames = ['myfile_1.csv.gz', 'myfile_2.csv.gz']
    for name in filenames:
        data = gzip.open(name, 'r')
        for row in data.read().splitlines():
            # do stuff
            pass
        data.close()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

时光无声 2025-01-20 23:28:54

使用 data.read(1) 代替 data.read() 一次读取一个字节。这将确保您可以挤出错误前的最后一个字节。使用'rb'读取二进制文件。在 try 中执行此操作以捕获错误。

import sys
import gzip
with gzip.open('bad.gz', 'rb') as gz:
    try:
        while True:
            got = gz.read(1)
            if len(got) == 0:
                break
            sys.stdout.buffer.write(got)
    except:
        pass

Instead of data.read() use data.read(1) to read one byte at a time. This will make sure you can squeeze out the very last byte before the error. Use 'rb' to read binary. Do it in a try to catch the error.

import sys
import gzip
with gzip.open('bad.gz', 'rb') as gz:
    try:
        while True:
            got = gz.read(1)
            if len(got) == 0:
                break
            sys.stdout.buffer.write(got)
    except:
        pass
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文