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

Python pickle反序列化报错:从文件读取pickle数据失败

关于Pickle读写文件的报错问题

我的假设与问题

  • rb = "read bytes" = 以字节模式读取文件
  • loads = load as bytes = 以字节形式加载数据(该假设可能有误)

我先尝试把pickle数据写入文件,代码如下:

import pickle

variables = {        
    1:['enable_family_chng', '0'],
    2:['enable_genus_chng', '0'],
    3:['enable_species_chng', '0'],
    4:['new_family_name', '0'], 
    5:['new_genus_name', '0'],
    6:['new_species_name', '0'],
}

#if species change is true then also enable add map or just open folder
# define dictionary varaibles
# just set all the variables[n][1] to 1
# better way to write this?... I think so! jst nt yt

variables[1]=['enable_family',{enable_family_chng}]
variables[2]=['enable_genus_chng',{enable_genus_chng}]
variables[3]=['enable_species_chng',{enable_species_chng}]
variables[4]=['new_family_name',{new_family_name}]
variables[5]=['new_genus_name',{new_genus_name}]
variables[6]=['new_species_name',{new_species_name}]

with open("variables.pickle", "wb") as file:
    pickle.dumps(variables)

之后尝试读取数据,第一次尝试的代码:

import pickle

with open("variables.pickle", "rb") as file:
    pickle.loads('variables.pickle' 'rb')

返回错误:

TypeError: a bytes-like object is required, not 'str'

第二次尝试的代码:

import pickle

with open("variables.pickle", "r") as file:
    pickle.load('variables.pickle' 'r')

返回错误:

TypeError: file must have 'read' and 'readline' attributes


错误分析与修正

写入代码的核心问题

  1. pickle.dumps()仅将对象序列化为字节字符串,不会主动写入文件,正确写法是用pickle.dump()直接将对象写入打开的二进制文件句柄。
  2. 代码中enable_family_chng等变量未定义,运行时会先触发NameError,必须先为这些变量赋值。
  3. 没必要把变量放在集合{}中,直接赋值即可。

读取代码的核心问题

  1. 第一次错误:pickle.loads()需要传入字节数据,而非文件名+模式的拼接字符串('variables.pickle' 'rb'会被Python自动拼接成'variables.picklerb',完全不符合预期);且已经用with打开了文件,应直接操作文件对象。
  2. 第二次错误:pickle.load()需要传入打开的二进制文件对象,而非文件名+模式;pickle是二进制格式,必须用rb模式打开,不能用文本模式r。

修正后的完整代码

写入代码

import pickle

# 先定义未声明的变量
enable_family_chng = 1
enable_genus_chng = 1
enable_species_chng = 1
new_family_name = "FamilyA"
new_genus_name = "GenusB"
new_species_name = "SpeciesC"

variables = {        
    1:['enable_family_chng', '0'],
    2:['enable_genus_chng', '0'],
    3:['enable_species_chng', '0'],
    4:['new_family_name', '0'], 
    5:['new_genus_name', '0'],
    6:['new_species_name', '0'],
}

# 直接赋值变量,无需集合包裹
variables[1]=['enable_family', enable_family_chng]
variables[2]=['enable_genus_chng', enable_genus_chng]
variables[3]=['enable_species_chng', enable_species_chng]
variables[4]=['new_family_name', new_family_name]
variables[5]=['new_genus_name', new_genus_name]
variables[6]=['new_species_name', new_species_name]

# 使用pickle.dump()将对象写入文件
with open("variables.pickle", "wb") as file:
    pickle.dump(variables, file)

读取代码

import pickle

# 以rb模式打开文件,用pickle.load()读取对象
with open("variables.pickle", "rb") as file:
    loaded_variables = pickle.load(file)

# 验证读取结果
print(loaded_variables)

关键函数澄清

  • pickle.dump(obj, file):将对象序列化后直接写入打开的二进制文件对象
  • pickle.dumps(obj):将对象序列化为字节字符串,返回该字符串(不写入文件)
  • pickle.load(file):从打开的二进制文件对象中读取并反序列化对象
  • pickle.loads(bytes_data):从字节字符串中反序列化对象

内容的提问来源于stack exchange,提问作者Marlon D. Alessandra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:24:21