如何读取存储在同一个DAT文件中的多个Python pickle对象?
解决方法
你按pickle.dump()的调用顺序依次调用pickle.load()就可以分别读取两个独立对象,不需要用到numpy、pandas这类额外库,完整的读取代码如下:
import pickle # 注意文件名大小写要和你保存的student.DAT对应,不然会找不到文件 with open("student.DAT", "rb") as loadFile: # 第一次load对应第一次dump的student1 loaded_stu1 = pickle.load(loadFile) # 第二次load对应第二次dump的student2 loaded_stu2 = pickle.load(loadFile) # 可以直接调用类方法验证读取结果 print(loaded_stu1.getName(), loaded_stu1.getRegNum(), loaded_stu1.getFullTime()) print(loaded_stu2.getName(), loaded_stu2.getRegNum(), loaded_stu2.getFullTime())
相关说明
- 你之前试的
with open(...) as ...是Python推荐的文件操作语法,作用是帮你自动关闭文件,不需要手动写loadFile.close(),可以避免忘记关文件导致的资源占用问题。之前不生效大概率是文件名大小写不匹配(你存的是大写后缀.DAT,试的时候写了小写.dat),或者没有按顺序调用两次pickle.load()。 - pickle的存储是序列化的,调用几次
dump就读几次load即可。如果你不知道文件里存了多少个对象,可以用异常捕获遍历读取所有对象,示例如下:
import pickle all_students = [] with open("student.DAT", "rb") as loadFile: while True: try: stu = pickle.load(loadFile) all_students.append(stu) except EOFError: break # all_students里就存储了所有序列化的Student对象 for stu in all_students: print(stu.getName())
- 不要用numpy.fromfile读取pickle序列化的文件,numpy的该方法是用来读取自身格式的二进制数据或者纯数值二进制文件的,读取pickle序列化的自定义类结果自然无法识别。
内容的提问来源于stack exchange,提问作者gangstersparrow
相关产品推荐
相关产品推荐

