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
错误分析与修正
写入代码的核心问题
pickle.dumps()仅将对象序列化为字节字符串,不会主动写入文件,正确写法是用pickle.dump()直接将对象写入打开的二进制文件句柄。- 代码中
enable_family_chng等变量未定义,运行时会先触发NameError,必须先为这些变量赋值。 - 没必要把变量放在集合
{}中,直接赋值即可。
读取代码的核心问题
- 第一次错误:
pickle.loads()需要传入字节数据,而非文件名+模式的拼接字符串('variables.pickle' 'rb'会被Python自动拼接成'variables.picklerb',完全不符合预期);且已经用with打开了文件,应直接操作文件对象。 - 第二次错误:
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
相关产品推荐
相关产品推荐

