cpickle支持的python版本_Python序列化模块pickle和cPickle-程序员宅基地

技术标签: cpickle支持的python版本  

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39702559/article/details/110829343

智能推荐

游戏玩家的程序猿之路-程序员宅基地

文章浏览阅读2.9k次,点赞6次,收藏2次。目录一.自我介绍二.编程目标三.学习编程的方法四.分配编程的时间五.最想进入的IT公司一.自我介绍大家好,这里是ONE_KICK,一名一名普通的大二学生,这是我的第一篇blog,现在还是一名编程小白,因为自己对于游戏的热爱决定开始学习基础的编程,来到CSDN,一方面是可以学习到很多的知识,另一方面是想要记录一下自己的学习历程。二.编程目标从零开始学习编程,打算先学习C语言,而后开始学习C++,近期的目标是在一年时间内掌握C++的用法。三.学习编程的方法打算稳扎稳打的学习C++,每天会有固定的时间

VC+API模拟键盘按键(详解篇)_vc模拟键盘输入-程序员宅基地

文章浏览阅读1.6w次。模拟键盘按键━━━━━━━━━━━━━━━━━━━━━━━━以前就想过如何模拟键盘按键向其他程序发送控制命令,但总是无功而返,这次也不例外。模拟按键的方法很多,如PostMessage(不能用SendMessage),SendInput,keybd_event。但最要命的是以上方法基本上都要窗口获取焦点时才有效。也就是想后台模拟键盘按键难度是很高的。当然有些特殊_vc模拟键盘输入

Docer容器客户端在启动的镜像的时候报错Error invoking remote method ‘docker-start-container‘: Error: (HTTP code 500_error invoking remote method 'docker-run-container-程序员宅基地

文章浏览阅读6.7k次,点赞8次,收藏3次。打开docker容器,启动redis镜像,报错:Error invoking remote method 'docker-start-container': Error: (HTTP code 500) server error - Ports are not available: listen tcp 0.0.0.0:2181: bind: An attempt was made to access a socket in a way forbidden by its access per._error invoking remote method 'docker-run-container': error: (http code 400)

数论模板-程序员宅基地

文章浏览阅读64次。组合数  递推void get_C(){ for(int i=0;i<=2005;i++) { C[0][i]=C[i][i]=1; for(int j=1;j<i;j++) { C[j][i]=(C[j-1][i-1]+C[j][i-1])%MOD; ..._inv2 数论

铜仁:实施大数据战略行动 打好经济社会跨越突围战-程序员宅基地

文章浏览阅读100次。近年来,铜仁市抢抓国家大数据战略和网络强国战略机遇,发挥创建大数据综合试验区和扶贫攻坚区域政策的叠加优势,将大数据与大扶贫两大战略融合发展,强化铜仁在武陵山片区的综合竞争力,以建设一个公共数据综合服务平台为核心,以提升产业发展能力、政府治理能力为目的,加快完善产业政策体系、数据标准体系、基础配套体系三大支撑,重点实施数据集聚、智慧铜仁、数据产业、生态文化..._铜仁市公共数据综合服务平台

Android -- Button简单的数字增加,重置_android studio中页面增加重置按钮代码,重置页面全部数据数据-程序员宅基地

文章浏览阅读4.9k次。简单的button 点击增加,点击归零重置功能。_android studio中页面增加重置按钮代码,重置页面全部数据数据

随便推点

将MNIST手写数字数据集导入NumPy数组(《深度学习入门:基于Python的理论与实现》实践笔记)_ubyte.gz用什么打开-程序员宅基地

文章浏览阅读1.2k次,点赞6次,收藏12次。将MNIST手写数字数据集导入NumPy数组下载MNIST数据集(使用urllib.request.urlretrieve()函数)打开下载得到的.gz压缩文件(使用gzip.open()函数)并导入NumPy数组(使用np.frombuffer()函数)完整实例(能直接运行):可能遇到的问题:下载MNIST数据集(使用urllib.request.urlretrieve()函数)os.path.exists(path)可以判断是否存在以path为地址的文件。urllib.request.urlre_ubyte.gz用什么打开

【剧前爆米花--C语言篇】C语言数组底层原理详解_数组的底层逻辑-程序员宅基地

文章浏览阅读1k次,点赞15次,收藏13次。对C语言数组的详细剖析,以及底层理解,相信你一定有所收获_数组的底层逻辑

java--html(6)框架_h|keycount| html-程序员宅基地

文章浏览阅读950次。框架标签:< frameset> < frameset rows=”10%,*”> < frame src=”1.html” name=”top” /> < frameset cols=”30%,*”> < frame src=”2.html” name=”left_h|keycount| html

虚机修改yum源_虚拟机如何优化yum源-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏7次。修改yum的下载源_虚拟机如何优化yum源

Jarvis OJ -BASIC-WRITE-UP_jarvisoj - basec - 「-.- 字符串」-程序员宅基地

文章浏览阅读3.8k次。似乎寒假起就没有好好刷过ctf题了,感觉菜的和狗一样。愈发的感觉到无力。所以来JarvisOJ修炼了,写个WP记录一下。BASIC veryeasyquestion:使用基本命令获取flaganswer:放winhex里面看下,没发现什么东西。题目说是基本命令,试了试binwalk,也什么都没有,再试strings。拿到flag。 关于USS Labquestion:USS的英文全称是什么,请全部..._jarvisoj - basec - 「-.- 字符串」

mysql添加外键的时候报错_mysql处理添加外键时 error 150 问题-程序员宅基地

文章浏览阅读163次。当你试图在mysql中创建一个外键的时候,这个出错会经常发生,这是非常令人沮丧的。像这种不能创建一个.frm 文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上,这个mysql报错已经被报告是一个mysql本身的bug并出现在mysql 开发者列表当中很多年了,然而这似乎又是一种误导。在很多实例中,这种错误的发生都是因为mysql一直以来都不能很好的支持的关系..._mysql添加外键时error