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

读取损坏的pandas_pickle_file.pkl遇EOFError,如何恢复数据?

恢复中断写入的Pickle文件部分数据

当pandas.to_pickle()线程被终止时,生成的pickle文件是不完整的,抛出EOFError是因为读取到文件末尾时,序列化数据流未完成。能否恢复数据取决于中断时的写入进度,以下是可行的尝试方法:

方法1:逐块解析序列化数据流

Pickle格式由多个序列化数据块组成,我们可以循环尝试读取每个完整的数据块,直到触发EOF错误:

import pickle
import pandas as pd

recovered_chunks = []
with open("你的损坏文件.pkl", "rb") as f:
    unpickler = pickle.Unpickler(f)
    while True:
        try:
            # 尝试读取单个序列化块
            chunk = unpickler.load()
            recovered_chunks.append(chunk)
        except EOFError:
            # 读取到文件末尾,终止循环
            break

# 尝试拼接恢复的数据
if recovered_chunks:
    try:
        # 如果每个块是DataFrame的分片,直接拼接
        recovered_df = pd.concat(recovered_chunks, ignore_index=True)
        print(f"成功恢复 {len(recovered_df)} 行数据")
    except Exception as e:
        # 如果原数据是单个未写完的DataFrame,无法直接拼接
        print(f"恢复了 {len(recovered_chunks)} 个数据块,但无法合并为DataFrame:{str(e)}")
else:
    print("未找到可恢复的数据块")

方法2:用pickletools分析文件结构

如果方法1无法拿到数据(比如原文件是单个未写完的DataFrame),可以用pickletools反汇编文件,查看序列化结构,尝试截取完整的字节段解析:

import pickletools

# 反汇编文件,查看序列化标记
with open("你的损坏文件.pkl", "rb") as f:
    pickletools.dis(f)

从输出中找到完整的对象起始和结束标记(比如MARK、STOP等),截取对应的字节范围后,再尝试反序列化。例如,如果你找到前N个字节是完整的对象,可以这样尝试:

with open("你的损坏文件.pkl", "rb") as f:
    partial_bytes = f.read(N)  # N为你找到的完整字节长度
    try:
        recovered_data = pickle.loads(partial_bytes)
        print("成功恢复部分数据")
    except:
        print("截取的字节段仍无法解析")

注意事项

  • 如果写入线程在刚开始写入就被终止,文件只有头部信息,可能无法恢复任何有效数据。
  • Pandas默认将整个DataFrame作为单个对象序列化,若中断发生在这个对象的写入过程中,方法1无法拿到完整的DataFrame,只能依赖方法2尝试截取部分字节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:53:17