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

Python使用pickle读取二进制txt文件出现UnpicklingError如何解决?

问题解决:pickle读取文件报_pickle.UnpicklingError: unpickling stack underflow

你遇到的报错核心原因是:待读取的文件不是pickle模块序列化生成的合法文件,或者文件本身存在损坏、不完整的问题。
pickle只能读取它自身pickle.dump()方法输出的二进制文件,并非所有二进制乱码文件都可以通过pickle解码。

可按以下步骤排查解决:

  • 第一步:确认文件来源与生成规则
    先确认该labels_test.txt的生成逻辑:如果是第三方输出的文件,先核实是否为pickle序列化产物,生成时使用的Python版本是2还是3,序列化时是否指定了特殊参数。
  • 第二步:校验文件完整性
    查看文件大小是否符合预期,若文件大小为0、或远小于同场景下的正常文件大小,说明文件在下载、传输过程中损坏/未完成传输,重新获取完整文件即可解决问题。
  • 第三步:代码优化与兼容调试
    你的代码中用了Python内置关键字dict作为变量名,虽不直接导致本次报错,但属于不规范写法,建议替换为自定义名称避免后续异常。如果确认文件是合法pickle文件,可以尝试调整读取参数适配不同版本生成的文件,示例代码如下:
    def unpickle(file_path):
        import pickle
        with open(file_path, 'rb') as fo:
            # 读取Python2生成的pickle文件时,常使用latin1编码
            pickle_data = pickle.load(fo, encoding='latin1')
        return pickle_data
    
    # 若文件是多个pickle对象拼接生成,可使用循环读取:
    def unpickle_multi(file_path):
        import pickle
        data_list = []
        with open(file_path, 'rb') as fo:
            while True:
                try:
                    data_list.append(pickle.load(fo, encoding='latin1'))
                except EOFError:
                    break
        return data_list
    
    file = unpickle('./labels_test.txt')
    print(file)
    
  • 第四步:非pickle文件的处理方案
    若核实该文件并非pickle序列化生成,需要按实际文件格式选择对应的读取方式:
    • 若是numpy输出的二进制文件,使用numpy.load()读取
    • 若是自定义结构的二进制文件,使用struct模块按字节规则解析

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:15:00