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模块按字节规则解析
- 若是numpy输出的二进制文件,使用
内容的提问来源于stack exchange,提问作者Root_
相关产品推荐
相关产品推荐

