You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gzip EOFError求助:Python读取压缩文件如何跳过损坏行?

解决gzip损坏文件跳过错误行继续读取的问题

要实现跳过损坏部分继续写入,核心是逐行读取并在单次读取操作中捕获异常,避免整个进程终止。同时要修正原代码中字节转字符串的错误(直接用str(line)会写入b'xxx'格式的内容,需要解码为文本)。

修改后的代码

import gzip

with open("small.txt", "a", encoding="utf-8") as save_file:
    with gzip.open("big.txt.gz", "rb") as gz_file:
        while True:
            try:
                # 逐行读取压缩文件内容
                line_bytes = gz_file.readline()
                if not line_bytes:
                    # 读取到文件末尾,退出循环
                    break
                # 将字节解码为字符串后写入目标文件
                save_file.write(line_bytes.decode("utf-8"))
            except EOFError:
                # 遇到压缩文件损坏标记,尝试跳过当前损坏段
                print("检测到损坏的压缩段,尝试跳过...")
                # 逐字节读取直到抛出异常(表示损坏段结束或文件真的结束)
                try:
                    while True:
                        gz_file.read(1)
                except:
                    break
            except Exception as e:
                # 处理其他未知错误,打印后继续尝试读取
                print(f"读取时遇到错误: {str(e)}")
                continue

关键说明

  1. 避免一次性读取:原代码用readlines()会一次性加载所有内容,出错直接终止;改为逐行循环读取,出错仅影响当前行。
  2. 正确处理字节解码:原代码中str(i)会将字节对象转为类似b'abc'的字符串,使用decode("utf-8")才能得到原始文本内容(需根据实际编码调整)。
  3. 异常分层处理:针对EOFError(压缩文件损坏的典型错误)单独处理,尝试跳过损坏的字节段;其他异常则直接跳过当前读取步骤,继续循环。

内容的提问来源于stack exchange,提问作者Tyoslax Beffs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:40:28