Python pickle模块(1) -- > 多次dump问题

大家在调用pickle模块的时候应该有遇到这个问题,当你多次pickle.dump 对象,写入到文件中,然后再pickle.load的时候,却只会load出来一个第一个数据,有木有?

eg:
测试pickle模块的时候发现dump进去数据可说倒不出来。。。
这里写图片描述

但你发现这个文件数据变大了,肯定是吃进去了。那我们用winhex瞅瞅:
这里写图片描述
这里写图片描述

肚子都大了,咋生不出来呢?
solution:

import os
import piskle
pkfile=open("D:\\testfile.txt",'ab') 
pickle.dump(data1,pkfile)
pickle.dump(data2,pkfile)
pkfile.close() 

和下面这两个load结果是不是一样?

pkfile=open("testfile.txt",'ab') 
pickle.dump(data1,pkfile)
pkfile.close() 

load出来的结果是一样的,但文件testfile.txt的大小确实不同 而且扔到winhex里也确实内容有变多可能我们都是习惯把数据修改好再重新dump覆盖掉之前的,可是如果真的需要追回并且一定要load出来改怎么办呢 ?

其实很简单, 我们正常dump一次 所以load一次就好了 这里我dump了两次 是不是要load两次才能把数据读出来呢。。。。果断试了下,代码:

import os
import pickle
data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}
data2 = {'aa': [1, 2.0, 3, 4+6j],
         'bb': ('string', u'Unicode string'),
         'cc': None}

pkfile=open("testfile.txt",'ab') 
pickle.dump(data1,pkfile)
pickle.dump(data2,pkfile)
pkfile.close() 

pkfile2=open("testfile.txt",'rb') 
pkf=pickle.load(pkfile2)
pkf1=pickle.load(pkfile2)

print(pkf)
print(pkf1)

load2次,结果如下:
这里写图片描述

所以解决方法如下:

Pickle 每次序列化生成的字符串有独立头尾,pickle.load() 只会读取一个完整的结果,所以你只需要在 load 一次之后再 load 一次,就能读到第二次序列化的 [‘asd’, (‘ss’, ‘dd’)]。如果不知道文件里有多少 pickle 对象,可以在 while 循环中反复 load 文件对象,直到抛出异常为止。

使用try … except语句即可。

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值