爬虫(五十二)通用标准库 pickle(四十三)

前面json章节中我们介绍过,json作为一种通用的数据交换格式和Python的持久化方式之一,只能对基本的一些内置数据类型(并且不是所有的)进行持久化。

而pickle模块则是Python专用的持久化模块,可以持久化包括自定义类在内的各种数据,比较适合Python本身复杂数据的存贮。pickle与json的操作基本一样,但是不同的是,它持久化后的字串是不可认读的,不如json的来得直观,并且只能用于Python环境,不能用作与其它语言进行数据交换,不通用。

主要方法

与json模块一模一样的方法名。但是在pickle中dumps()和loads()操作的是bytes类型,而不是json中的str类型;在使用dump()和load()读写文件时,要使用rbwb模式,也就是只接收bytes类型的数据。

一些例子

>>> import pickle
>>> dic = {"k1":"v1","k2":123}
>>> s = pickle.dumps(dic)
>>> type(s)
<class 'bytes'>
>>> s
b'\x80\x03}q\x00(X\x02\x00\x00\x00k1q\x01X\x02\x00\x00\x00v1q\x02X\x02\x00\x00\x00k2q\x03K{u.'
>>> dic2 = pickle.loads(s)
>>> dic2
{'k1': 'v1', 'k2': 123}
>>> type(dic2)
<class 'dict'>
import pickle

data = {
    'a': [1, 2.0, 3, 4+6],
    'b': ("character string", b"byte string"),
    'c': {None, True, False}
}

with open('data.pickle', 'wb') as f:
    pickle.dump(data, f)

可以尝试用文本编辑器打开上面保存的data文件,会发现其中全是不可认读的编码。

import pickle

with open('data.pickle', 'rb') as f:
    data = pickle.load(f)

dump()方法能一个接着一个地将几个对象转储到同一个文件。随后调用load()可以同样的顺序一个一个检索出这些对象。

>>> a1 = 'apple'
>>> b1 = {1: 'One', 2: 'Two', 3: 'Three'}
>>> c1 = ['fee', 'fie', 'foe', 'fum']
>>> f1 = open('temp.pkl', 'wb')
>>> pickle.dump(a1, f1)
>>> pickle.dump(b1, f1)
>>> pickle.dump(c1, f1)
>>> f1.close()
>>> f2 = open('temp.pkl', 'rb')
>>> a2 = pickle.load(f2)
>>> a2
'apple'
>>> b2 = pickle.load(f2)
>>> b2
{1: 'One', 2: 'Two', 3: 'Three'}
>>> c2 = pickle.load(f2)
>>> c2
['fee', 'fie', 'foe', 'fum']
>>> f2.close()

Pickle可以持久化Python的自定义数据类型,但是在反持久化的时候,必须能够读取到类的定义。

import pickle

class Person:
    def __init__(self, n, a):
        self.name = n
        self.age = a

    def show(self):
        print(self.name+"_"+str(self.age))

aa = Person("张三", 20)
aa.show()
f = open('d:\\1.txt', 'wb')
pickle.dump(aa, f)
f.close()
# del Person        # 注意这行被注释了
f = open('d:\\1.txt', 'rb')
bb = pickle.load(f)
f.close()
bb.show()

如果取消对del Person这一行的注释,在代码中删除了Person类的定义,那么后面的load()方法将会出现错误。这一点很好理解,因为如果连数据的内部结构都不知道,pickle怎么能将数据正确的解析出来呢?

请继续关注我

记得点赞加关注哦,记得加鸡腿啊

博客
v8worker
05-08 2905
05-06 2886
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值