当前位置: 首页 > news >正文

Python标准库05 存储对象 (pickle包,cPickle包)(转载)

Python标准库05 存储对象 (pickle包,cPickle包)

 

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

谢谢reverland纠错

 

在之前对Python对象的介绍中 (面向对象的基本概念,面向对象的进一步拓展),我提到过Python“一切皆对象”的哲学,在Python中,无论是变量还是函数,都是一个对象。当Python运行时,对象存储在内存中,随时等待系统的调用。然而,内存里的数据会随着计算机关机和消失,如何将对象保存到文件,并储存在硬盘上呢?

计算机的内存中存储的是二进制的序列 (当然,在Linux眼中,是文本流)。我们可以直接将某个对象所对应位置的数据抓取下来,转换成文本流 (这个过程叫做serialize),然后将文本流存入到文件中。由于Python在创建对象时,要参考对象的类定义,所以当我们从文本中读取对象时,必须在手边要有该对象的类定义,才能懂得如何去重建这一对象。从文件读取时,对于Python的内建(built-in)对象 (比如说整数、词典、表等等),由于其类定义已经载入内存,所以不需要我们再在程序中定义类。但对于用户自行定义的对象,就必须要先定义类,然后才能从文件中载入对象 (比如面向对象的基本概念中的对象那个summer)。

 

pickle包

对于上述过程,最常用的工具是Python中的pickle包。

1) 将内存中的对象转换成为文本流:

复制代码
import pickle

# define class
class Bird(object):
    have_feather = True
    way_of_reproduction  = 'egg'

summer       = Bird()                 # construct an object
picklestring = pickle.dumps(summer)   # serialize object
复制代码

使用pickle.dumps()方法可以将对象summer转换成了字符串 picklestring(也就是文本流)。随后我们可以用普通文本的存储方法来将该字符串储存在文件(文本文件的输入输出)。

 

当然,我们也可以使用pickle.dump()的方法,将上面两部合二为一:

复制代码
import pickle

# define class class Bird(object): have_feather = True way_of_reproduction = 'egg' summer = Bird() # construct an object fn = 'a.pkl' with open(fn, 'w') as f: # open file with write-mode
picklestring = pickle.dump(summer, f) # serialize and save object
复制代码

对象summer存储在文件a.pkl

 

2) 重建对象

首先,我们要从文本中读出文本,存储到字符串 (文本文件的输入输出)。然后使用pickle.loads(str)的方法,将字符串转换成为对象。要记得,此时我们的程序中必须已经有了该对象的类定义。

 

此外,我们也可以使用pickle.load()的方法,将上面步骤合并:

复制代码
import pickle

# define the class before unpickle
class Bird(object):
    have_feather = True
    way_of_reproduction  = 'egg'

fn     = 'a.pkl'
with open(fn, 'r') as f:
    summer = pickle.load(f)   # read file and build object
复制代码

 

 

cPickle包

cPickle包的功能和用法与pickle包几乎完全相同 (其存在差别的地方实际上很少用到),不同在于cPickle是基于c语言编写的,速度是pickle包的1000倍。对于上面的例子,如果想使用cPickle包,我们都可以将import语句改为:

import cPickle as pickle

就不需要再做任何改动了。

 

总结

对象 -> 文本 -> 文件

pickle.dump(), pickle.load(), cPickle

转载于:https://www.cnblogs.com/cnshen/articles/3703962.html

相关文章:

  • 软件工程-冲刺周
  • freemarker中常用的shiro标签
  • 企业该分多少钱给员工?看柏明顿阿米巴奖金分配方案
  • Ubuntu下部署java JDK和eclipse IDE
  • Docker镜像的目录存储讲解
  • SpringBoot中Mybaties PageHelper插件使用
  • Pop - Facebook 开源 iOS OS X 动画库
  • 一个程序员的自白(延迟满足)
  • Apache ab 压力测试
  • 依赖注入框架 InversifyJS
  • 10.30T2 二分+前缀和(后缀和)
  • 数据流的压缩、编码及传递困扰
  • Linux基础命令---mkisofs
  • Linux iptables开放特定端口
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • [译] 怎样写一个基础的编译器
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 4. 路由到控制器 - Laravel从零开始教程
  • Babel配置的不完全指南
  • css系列之关于字体的事
  • JavaScript异步流程控制的前世今生
  • jQuery(一)
  • Leetcode 27 Remove Element
  • MySQL-事务管理(基础)
  • php面试题 汇集2
  • python docx文档转html页面
  • rc-form之最单纯情况
  • vue:响应原理
  • 测试如何在敏捷团队中工作?
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 强力优化Rancher k8s中国区的使用体验
  • 如何在 Tornado 中实现 Middleware
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 我感觉这是史上最牛的防sql注入方法类
  • 我是如何设计 Upload 上传组件的
  • 回归生活:清理微信公众号
  • ​【已解决】npm install​卡主不动的情况
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # C++之functional库用法整理
  • #ifdef 的技巧用法
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $L^p$ 调和函数恒为零
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (LeetCode) T14. Longest Common Prefix
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (四)JPA - JQPL 实现增删改查
  • (学习日记)2024.01.09
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Oracle存储过程编写经验和优化措施