cpickle支持的python版本_Python序列化模块pickle和cPickle
Python的序列化是指把變量從內存中變為可以儲存/傳輸的數據/文件的過程. 在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是一個意思。序列化之后,就可以把序列化后的內容寫入磁盤,或者通過網絡傳輸到別的機器上。反過來,把變量內容從序列化的對象重新讀到內存里稱之為反序列化,即unpickling。
在Python中最基礎的實現序列化的兩個模塊是cPickle和pickle模塊, 功能基本一樣, 前者是C寫的更快, 后者是python寫的會慢點. 一般優先使用cPickle. 這里只介紹cPickle, 一般用其四個函數(dump、dumps、dump、loads)也就OK了, pickle包含了類和另外一些內容, 更多細節可以看官方手冊。一般引用時我們會做如下引用:
try:
import cPickle as pickle
except ImportError:
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、寫入文件及讀取
#!/usr/bin/env python
# coding=utf-8
# code from www.361way.com
try:
import cPickle as pickle
except:
import pickle
obj = {'a' : 'b', 'c' : 'd'}
obj2 = [0, 1, 1, 0, 1]
f = open('obj.pkl', 'wb')
pickle.dump(obj, f, protocol=2)
pickle.dump(obj2, f, protocol=2)
f.close()
f = open('obj.pkl', 'rb')
x1 = pickle.load(f)
x2 = pickle.load(f)
print x1,x2
f.close()
這里保存數據的時候,選用的是protocol 2,所以保存后的obj.pkl 打開會發現是亂碼 。這里需要注意的是pickle不能指定key信息,只能按順序一次次的load結果 。這點不像shelve模塊 。
2、寫入內存及讀寫
示例1中通過open將數據寫入二進制文件或讀取,通過StringIO模塊,也可以將數據在內存中進行寫入和讀取 ,示例如下:
try:
import cPickle as pickle
except:
import pickle
import pprint
from StringIO import StringIO
class SimpleObject(object):
def __init__(self, name):
self.name = name
l = list(name)
l.reverse()
self.name_backwards = ''.join(l)
return
data = []
data.append(SimpleObject('pickle'))
data.append(SimpleObject('cPickle'))
data.append(SimpleObject('last'))
# Simulate a file with StringIO
out_s = StringIO()
# Write to the stream
for o in data:
print 'WRITING: %s (%s)' % (o.name, o.name_backwards)
pickle.dump(o, out_s)
out_s.flush()
# Set up a read-able stream
in_s = StringIO(out_s.getvalue())
# Read the data
while True:
try:
o = pickle.load(in_s)
except EOFError:
break
else:
print 'READ: %s (%s)' % (o.name, o.name_backwards)
執行結果如下:
$ python pickle_stream.py
WRITING: pickle (elkcip)
WRITING: cPickle (elkciPc)
WRITING: last (tsal)
READ: pickle (elkcip)
READ: cPickle (elkciPc)
READ: last (tsal)
3、pickle對像元素操作
在成為pickle的對象后即為列表對象,由此可對list進行一系列的操作,如下是一個append的示例:
>>> pw = open('test1','wb')
>>> pw.write(pickle.dumps(['a','b']))
>>> pw.close()
>>> pr = open("test1","rb")
>>> prf = pickle.load(pr)
>>> print(prf)
['a', 'b']
>>> print(prf.append('c'))
None
>>> print(prf)
['a', 'b', 'c']
總結
以上是生活随笔為你收集整理的cpickle支持的python版本_Python序列化模块pickle和cPickle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 优先队列_python中使
- 下一篇: python每隔30s检查一次_用Pyt