pickle反序列化后存储pd.DataFrame列表的容器类返回空列表问题
问题根源与解决方案
问题原因
你的容器类中l是类属性,而非实例属性。类属性由所有类实例共享,pickle序列化对象时不会保存类属性的当前状态(因为它属于类本身,不是单个实例的私有数据):
- 同一脚本内连续执行保存和加载时,当前会话中类的
l还保留着添加的数据,所以加载后能正常显示; - 单独执行加载操作时,新会话里类的
l是初始的空列表,反序列化后的实例依然指向这个类属性,因此显示为空。
修复代码
将l改为实例属性,在类的__init__方法中初始化:
import pandas as pd import pickle data1 = [[12.0, 13.1], [14.0, 15.0]] data2 = [[24.0, 25.1], [26.0, 27.0]] df1 = pd.DataFrame(data1, columns=["T11", "T12"]) df2 = pd.DataFrame(data2, columns=["T11", "T12"]) class container(): def __init__(self): self.l = [] # 定义为实例属性,每个实例独立拥有 def append_l(self, df): self.l.append(df) # 实例化并保存(单独加载时可注释此段) device = container() device.append_l(df1) device.append_l(df2) with open("save.pkl", "wb") as outfile: pickle.dump(device, outfile) # 加载操作 with open("save.pkl", "rb") as infile: loaded = pickle.load(infile) print(loaded.l)
修复说明
把l移到__init__中作为实例属性后,每个container实例都会拥有自己独立的列表。此时pickle会正确序列化实例的私有数据,单独执行加载操作时,反序列化得到的实例会携带保存时的完整列表内容,不会再指向空的类属性。
内容的提问来源于stack exchange,提问作者Wendel
相关产品推荐
相关产品推荐

