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']

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值