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
关键说明
- 避免一次性读取:原代码用
readlines()会一次性加载所有内容,出错直接终止;改为逐行循环读取,出错仅影响当前行。 - 正确处理字节解码:原代码中
str(i)会将字节对象转为类似b'abc'的字符串,使用decode("utf-8")才能得到原始文本内容(需根据实际编码调整)。 - 异常分层处理:针对
EOFError(压缩文件损坏的典型错误)单独处理,尝试跳过损坏的字节段;其他异常则直接跳过当前读取步骤,继续循环。
内容的提问来源于stack exchange,提问作者Tyoslax Beffs
相关产品推荐
相关产品推荐

