Python序列化模块pickle和cPickle
Python的序列化是指把变量从内存中变为可以储存/传输的数据/文件的过程. 在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
在Python中最基础的实现序列化的两个模块是cPickle和pickle模块, 功能基本一样, 前者是C写的更快, 后者是python写的会慢点. 一般优先使用cPickle. 这里只介绍cPickle, 一般用其四个函数(dump、dumps、dump、loads)也就OK了, pickle包含了类和另外一些内容, 更多细节可以看官方手册。一般引用时我们会做如下引用:
1try:
2 import cPickle as pickle
3except ImportError:
4 import pickle
一、导出数据 和 导入数据
1、导出数据
dump 导出数据(序列化)主要有两个函数:
- dump(data,file_handle[, protocol]) : 将数据序列化到文件.
- dumps(data[, protocol]) : 将数据序列化成字符串.
protocol是数据流处理策略:
- 0: ascii串保存, 默认形式, 方便人读取
- 1: 旧式兼容性较强2进制形式
- 2: 支持新式类的2进制模式,Python2.3开始引入.
2、导入数据
load 载入数据(反序列化)主要有两个函数:
- load(file) : 将序列化数据从文件读入返回数据.
- loads(string) : 将字符串的序列化数据读入并返回数据.
二、示例
1、写入文件及读取
1#!/usr/bin/env python
2# coding=utf-8
3# code from www.361way.com
4try:
5 import cPickle as pickle
6except:
7 import pickle
8obj = {'a' : 'b', 'c' : 'd'}
9obj2 = [0, 1, 1, 0, 1]
10f = open('obj.pkl', 'wb')
11pickle.dump(obj, f, protocol=2)
12pickle.dump(obj2, f, protocol=2)
13f.close()
14f = open('obj.pkl', 'rb')
15x1 = pickle.load(f)
16x2 = pickle.load(f)
17print x1,x2
18f.close()
这里保存数据的时候,选用的是protocol 2,所以保存后的obj.pkl 打开会发现是乱码 。这里需要注意的是pickle不能指定key信息,只能按顺序一次次的load结果 。这点不像shelve模块 。
2、写入内存及读写
示例1中通过open将数据写入二进制文件或读取,通过StringIO模块,也可以将数据在内存中进行写入和读取 ,示例如下:
1try:
2 import cPickle as pickle
3except:
4 import pickle
5import pprint
6from StringIO import StringIO
7class SimpleObject(object):
8 def __init__(self, name):
9 self.name = name
10 l = list(name)
11 l.reverse()
12 self.name_backwards = ''.join(l)
13 return
14data = []
15data.append(SimpleObject('pickle'))
16data.append(SimpleObject('cPickle'))
17data.append(SimpleObject('last'))
18# Simulate a file with StringIO
19out_s = StringIO()
20# Write to the stream
21for o in data:
22 print 'WRITING: %s (%s)' % (o.name, o.name_backwards)
23 pickle.dump(o, out_s)
24 out_s.flush()
25# Set up a read-able stream
26in_s = StringIO(out_s.getvalue())
27# Read the data
28while True:
29 try:
30 o = pickle.load(in_s)
31 except EOFError:
32 break
33 else:
34 print 'READ: %s (%s)' % (o.name, o.name_backwards)
执行结果如下:
1$ python pickle_stream.py
2WRITING: pickle (elkcip)
3WRITING: cPickle (elkciPc)
4WRITING: last (tsal)
5READ: pickle (elkcip)
6READ: cPickle (elkciPc)
7READ: last (tsal)
3、pickle对像元素操作
在成为pickle的对象后即为列表对象,由此可对list进行一系列的操作,如下是一个append的示例:
1>>> pw = open('test1','wb')
2>>> pw.write(pickle.dumps(['a','b']))
3>>> pw.close()
4>>> pr = open("test1","rb")
5>>> prf = pickle.load(pr)
6>>> print(prf)
7['a', 'b']
8>>> print(prf.append('c'))
9None
10>>> print(prf)
11['a', 'b', 'c']
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-pickle/5326.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.