Python中的序列化指的是在程序运行期间,变量都是在内存中保存着的,如果我们想保留一些运行中的变量值,就可以使用序列化操作把变量内容从内存保存到磁盘中,在Python中这个操作叫pickling,等下次再使用保存的变量时,可以通过反序列化操作提取数据内容到内存,即unpickling

我们先来介绍pickle模块,它就是Python提供用来序列化对象的模块,假如现在我们把一个对象序列化。

import pickle
d=dict(name='zhangkang',age=20,sex='man')
#以二进制的方式写入pk.txt
with open('pk.txt','wb') as f:
pickle.dump(d,f)

这样在当前程序运行目录就会生成一个pk.txt文件,里面保存着d对象,下面我们把序列化的对象内容提取出来,也就是反序列化。

import pickle
with open('pk.txt','r') as f:
d=pickle.load(f)
print(type(d))
print(d) 输出:
<type 'dict'>
{'age': 20, 'name': 'zhangkang', 'sex': 'man'}

**pickle.dump()直接把对象序列化后写入一个file-like Object:

pickle.load()方法从一个file-like Object中直接反序列化出对象**

当然我们也可以使用pickle.dumps()方法把对象序列化成一个str,然后,就可以把这个str写入文件。当我们要把对象从磁盘读到内存时,可以先把内容读到一个str,然后用pickle.loads()方法反序列化出对象

import pickle
d=dict(name='zhangkang',age=20,sex='man')
s=pickle.dumps(d)
#先看下s的类型和内容
print(type(s))
print(s) print('\n')
#把s保存到文件,再从文件读取,就是文件
#操作的内容了,本程序不演示了,现在我们把s
#反序列化
ss=pickle.loads(s)
print(type(ss))
print(ss) 输出:
<type 'str'>
(dp0
S'age'
p1
I20
sS'name'
p2
S'zhangkang'
p3
sS'sex'
p4
S'man'
p5
s. <type 'dict'>
{'age': 20, 'name': 'zhangkang', 'sex': 'man'}

json模块

假如我们需要在不同的编程语言之间传递对象,就需要把对象序列化成标准格式,类型于XML,但是序列化成json比XML更好,速度也更快,并且可以直接在web页面读取,序列成json后其实就是个字符串,任何语言都能读取,也可以方便的存储到磁盘或者通过网络传输。

JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

json类型——Python类型

{ }——dict

[ ]——,list

string——str或者u’unicode’

true/false——True/False

null ——None

Python内置的json模块提供了完善的Python对象到json格式的转换。先看看如何把Python对象变成一个json:

import json
d=dict(name='zhangkang',age=20,score=88)
#这里dumps(),loads(),dump(),load()的用法和pickle模块一样
a=json.dumps(d)
print(type(a))
#这里输出的字符串和上面讲的pickle的不同,格式变了。
print(a)
print('\n') c=json.loads(a)
print(type(c))
#这里注意,所有反序列化后的字符串对象类型不是str,而是unicode,因为
#JSON标准规定JSON编码是UTF-8,所以我们总能在Python的str或unicode与JSON的字符串之间转换。
print(c) 输出:
<type 'str'>
{"age": 20, "score": 88, "name": "zhangkang"} <type 'dict'>
{u'age': 20, u'score': 88, u'name': u'zhangkang'}

如果我们要对一个类对象序列化成标准格式:

import json

class People(object):
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def people_dict(p):
d=dict()
d['name']=p.name
d['age']=p.age
d['sex']=p.sex
return d
p=People('zhangkang',24,'man')
js_p=json.dumps(p,default=people_dict)
print(type(js_p))
print(js_p) 输出:
<type 'str'>
{"age": 24, "name": "zhangkang", "sex": "man"}

默认情况下,dumps()方法不知道如何将People()实例变为一个json的{ }对象。可选参数default就是把任意一个对象变成一个可序列为json的对象,我们只需要为People专门写一个转换函数,再把函数传进去。People()实例首先被people_dict()函数转换成dict,然后再被顺利序列化为json。

如何把类对象反序列化呢?

import json

class People(object):
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def people_dict(p):
d=dict()
d['name']=p.name
d['age']=p.age
d['sex']=p.sex
return d
def dict_people(d):
return People(d['name'],d['age'],d['sex']) #序列化
p=People('zhangkang',24,'man')
js_p=json.dumps(p,default=people_dict)
print(type(js_p))
print(js_p) print('\n') #反序列化
pp=json.loads(js_p, object_hook=dict_people)
print(type(pp))
print(pp.name)
print(pp.age)
print(pp.sex) 输出:
<type 'str'>
{"age": 24, "name": "zhangkang", "sex": "man"} <class '__main__.People'>
zhangkang
24
man

我们要把json反序列化为一个People对象实例,loads()方法首先把js_p转换成一个dict对象,然后把这个dict传入object_hook函数被转换为People实例。

Python中的序列化以及pickle和json模块介绍的更多相关文章

  1. Python开发之序列化与反序列化:pickle、json模块使用详解

    1 引言 在日常开发中,所有的对象都是存储在内存当中,尤其是像python这样的坚持一切接对象的高级程序设计语言,一旦关机,在写在内存中的数据都将不复存在.另一方面,存储在内存够中的对象由于编程语言. ...

  2. Python序列化-pickle和json模块

    Python的“file-like object“就是一种鸭子类型.对真正的文件对象,它有一个read()方法,返回其内容.但是,许多对象,只要有read()方法,都被视为“file-like obj ...

  3. Python os、sys、pickle、json等模块

    1.os 所有和操作系统相关的内容都在os模块,一般用来操作文件系统 import os os.makedirs('dirname1/dirname2') # 可生成多层递归目录 os.removed ...

  4. python中的序列化和反序列化

    ~~~~~~滴滴,,什么是序列呢?可以理解为序列就是字符串.序列化的应用 写文件(数据传输) 网络传输 序列化和反序列化的概念   序列化模块:将原本的字典.列表等内容转换成一个字符串的过程就叫做序列 ...

  5. pytho中pickle、json模块

    pickle & json 模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 json模块提供了四 ...

  6. (数据科学学习手札142)dill:Python中增强版的pickle

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,相信不少读者朋友们都在Pyth ...

  7. Python中:dict(或对象)与json之间的互相转化

    在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作. 在Python中自带json库.通过import json导入. 在json模块有2个方法, loads():将 ...

  8. Python中如何将数据存储为json格式的文件

    一.基于json模块的存储.读取数据 names_writer.py import json names = ['joker','joe','nacy','timi'] filename='names ...

  9. pickle和json模块

    json模块 json模块是实现序列化和反序列化的,主要用户不同程序之间的数据交换,首先来看一下: dumps()序列化 import json '''json模块是实现序列化和反序列话功能的''' ...

随机推荐

  1. POJ-325Corn Fields

    链接:https://vjudge.net/problem/POJ-3254#author=freeloop 题意: 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ ...

  2. Unity AssetBundle笔记

    1.入门: Resources:表示U3D自动将资源打成一个AssetBundle包,所有放在Resources下的文件夹都会打成一个AssetBundle包,资源非常大,Resources文件夹在真 ...

  3. Java微信公众平台开发(七)--多媒体消息回复之图片回复

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消息的回复方法,[多媒体消息]包含回复图片消息/回复语音消息/回复视频消息/回复音乐消 ...

  4. 安卓,IOS真机调试

    移动端前端开发真机调试攻略 有线调试: 一.IOS 移动端 (Safari开发者工具) 手机端:设置 → Safari → 高级 → Web 检查器 → 开. mac端:Safari → 偏好设置 → ...

  5. eCharts基础知识

    eCharts插件介绍 http://echarts.baidu.com/tutorial.html#ECharts%20%E7%89%B9%E6%80%A7%E4%BB%8B%E7%BB%8D

  6. js对象引用赋值后

    a={f:1} b={} b.a=a console.log(b.a) a.b=2 console.log(b.a) a={f:1} b={} b.a=a console.log(b.a) a={b: ...

  7. 【Web应用-Kudu】Kudu 管理和诊断 azure web 应用

    Azure  Kudu是 GitHub 上的一个开源项目,Kudu 站点 (也称为网站控制管理 SCM) 提供了一系列的在线工具,可以帮助用户查看 web 应用的设置,诊断 web 应用,以及安装 w ...

  8. Android学习总结(十四) ———— ListView Item多布局的实现

    一.基本概念 实现一个Item的多布局.像我们经常在用的各种即时通讯工具,QQ.微信等,假设他们的会话界面是ListView实现的,那么ListView就有多种Item布局,要实现ListView里面 ...

  9. SQLite-表达式

    SQLite -表达式 一个表达式是一个或多个值的组合,运算符和SQL函数,评价一个值. SQL表达式就像公式和都写在查询语言.您还可以使用为特定的数据集查询数据库. 语法: 考虑到SELECT语句的 ...

  10. “流”的思维—Workflowy

    3.“流”的思维—Workflowy是我最喜欢的”流“的工具(WorkFlowy - Organize your brain.)我觉得,让发散性的思维更具实施性,必须分步操作,必须有先后,必须单线程. ...