json / pickle 数据序列化

序列化定义:把变量从内存中变成可存储或传输的过程称为序列化。
反序列化:把变量内容从序列化的对象重新读到内存里称为反序列胡。 序列化模块之--pickle
使用注意:在python3里,进行一次序列化后,然后在进行反序列化,不要重复多次序列化,否则无法进行反序列化。
pickle:是python独有的序列化模块,只能作用于python变量,是将数据对象转化为bytes。
功能:用于python特有的类型和python的数据类型间进行转换。
举例:
 import pickle
d = {'name':'jeck','age':''}
print(pickle.dumps(d))
打印出:b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x08 #这里b代表为bytes
pickle的4个功能如下:
dumps , dump:进行序列化功能
loads , load:进行反序列化功能
序列化举例1:
dumps 序列化作用于变量,将传入的变量序列化为一个bytes,然后可以写入磁盘。
 import pickle
d = {'name':'jeck','age':'','工作':'IT'}
f = open('fname','wb') #必须以二进制读写
f.write(pickle.dumps(d))
f.close()
序列化举例2:
dump 直接将变量序列化到文件中
 import pickle
d = {'name':'jeck','age':'','工作':'IT'}
f = open('fname1','wb')
pickle.dump(d,f)
f.close()
反序列化举例1:
loads:把对象从磁盘读入内存时,先把内容读到一个bytes,然后用loads进行反序列化
 import pickle
f = open('fname','rb')
print(pickle.loads(f.read())) #将bytes通过loads进行反序列化
f.close()
反序列化举例2:
load:直接将dump后的序列化文件进行反序列化载入。
 import pickle
f = open('fname1','rb')
print(pickle.load(f))
f.close()
序列化模块之-- json
json:是个对象序列化的标准格式,用于在不同编程语言之间进行对象的传递。类似的有xml。
但和xml表现形式不同,json表现为一个字符串,xml是用标记标注的不易阅读。在速度上json也比xml快。
注意:一般用于序列化通用的列表,字典,等常用序列。如果要序列化python里的函数,类需要单独指定
方法和pickle一样,有:dumps,dump 进行序列化。loads,load 进行反序列化
功能:用于字符串和python数据类型间进行转换。
举例:json序列化后的格式为字符串
 import json
d = {'name':'jeck','age':'','工作':'IT'}
print(json.dumps(d))
print(type(json.dumps(d)))
打印:
{"name": "jeck", "age": "22", "\u5de5\u4f5c": "IT"}
<class 'str'>
序列化举例1:
dumps 序列化作用于变量,将传入的变量序列化为一个字符串,然后可以写入磁盘。
 import json
d = {'name':'jeck','age':'','工作':'IT'}
f = open('fname','w')
f.write(json.dumps(d))
f.close()
序列化举例2:
dump 直接将变量序列化到文件中
import json
d = {'name':'jeck','age':'','工作':'IT'}
f = open('fname1','w')
json.dump(d,f)
f.close()
反序列化举例1:
loads:先读取对象,然后用loads进行反序列化
 import json
f = open('fname','r')
print(json.loads(f.read())) #将字符串通过loads进行反序列化
f.close()
反序列化举例2:
load:直接将dump后的序列化文件进行反序列化载入。
 import json
f = open('fname1','rb')
print(json.load(f))
f.close()
# 注意 json也可以序列化python中的函数和类,但是序列化后的数据只是函数或者类的结果数据。
举例序列化一个类:
 import json
def fun(n):
return n
x = fun('jeck')
f = open('fname','w')
f.write(json.dumps(x,default=fun)) #default参数就是告知json如何进行序列化
f.close
一般通用方法为:
print(json.dumps(x, default=lambda obj: obj.__dict__))
其中的__dict__不需我们在类中定义,因为通常class的实例都有一个__dict__属性,它就是一个字典,用来存储实例变量.
当然函数和类序列化一般也不会使用。 在单独举例通过pickle对函数的序列化和反序列化举例
1:进行函数的序列化
 import pickle
def fun(n):
return n
f = open('fname','wb')
f.write(pickle.dumps(fun))
f.close #成功
2:进行反序列化
import pickle
f = open('fname','rb')
pickle.loads(f.read())
f.close
报错:AttributeError: Can't get attribute 'fun' on <module '__main__' from
是因为序列化后内存已释放这个函数的内存地址,所以报错。需要手工把这个函数添加到反序列化开头如下:
 import pickle
def fun(n):
return n # 这个函数内容可以手工修改。
f = open('fname','rb')
print(pickle.loads(f.read()))
f.close
这样才可以实现函数的反序列化,个人觉得没啥意义。而且反序列化时可以先修改函数内容,这样反序列化出的内容就是修改后的内容。

注意:pickle和json的序列化和反序列化必须各自独自使用,不能相互混用。

python学习之 -- 数据序列化的更多相关文章

  1. [Python] Python 学习 - 可视化数据操作(一)

    Python 学习 - 可视化数据操作(一) GitHub:https://github.com/liqingwen2015/my_data_view 目录 折线图 散点图 随机漫步 骰子点数概率 文 ...

  2. Python学习之json序列化

    一.什么是序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式.这个过程叫序列化,不同的序列化结果也不同,但目的是一样的,都是为了存储和传输 在 ...

  3. Python学习记录----数据定义

    摘要: 描述Python中数据定义格式,需要注意的东东. 一 数据声明 Python木有一般语言的具体数据类型,像char,int,string这些通通木有.这有点像javascript,但又不同,j ...

  4. 从零开始的Python学习Episode 17——序列化

    序列化 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语 言中也被称之为serialization,marshalling,flattenin ...

  5. 【Python】python学习文件的序列化和反序列化

    json和pickle序列化和反序列化 json是用来实现不同程序之间的文件交互,由于不同程序之间需要进行文件信息交互,由于用python写的代码可能要与其他语言写的代码进行数据传输,json支持所有 ...

  6. python学习--大数据与科学计算第三方库简介

    大数据与科学计算  库名称 简介 pycuda/opencl GPU高性能并发计算 Pandas python实现的类似R语言的数据统计.分析平台.基于NumPy和Matplotlib开发的,主要用于 ...

  7. python学习-pickle模块(序列化)

    简介 1 python-pickle模块 该pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. "Pickling"是将Python对象层次结构转换为字节 ...

  8. Python学习_数据排序方法

    Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2, ...

  9. python中后端数据序列化不显示中文的解决方法

    我们在前后端交互的时候,让序列化的数据更友好的显示,我们会用到 import json js = json.loads('{"name": "多多"}') pr ...

随机推荐

  1. vba,自定义公式,农历互转公历,excel ,wps

    'vba 模块内容如下 自定义公式 '公历转农历模块 '原创:互联网 '修正: '// 农历数据定义 // '先以 H2B 函数还原成长度为 18 的字符串,其定义如下: '前12个字节代表1-12月 ...

  2. 机器学习在SAP Cloud for Customer中的应用

    关于机器学习这个话题,我相信我这个公众号1500多位关注者里,一定有很多朋友的水平比Jerry高得多.如果您看过我以前两篇文章,您就会发现,我对机器学习仅仅停留在会使用API的层面上. 使用Java程 ...

  3. C# 创建目录

    C#创建目录 var strpatj = HttpRuntime.AppDomainAppPath; if (!Directory.Exists(strpatj+"\\temp") ...

  4. VMware 彻底删除虚拟机操作系统的方法

    方法一 首先,都需要点击左边的虚拟机列表,选中你要删除的操作系统 点击VMwae上方的虚拟机-管理-从硬盘删除. 方法二 右键左侧列表中要删除的系统-移除. 然后在硬盘上找到其所在文件夹,直接按SHI ...

  5. 获取声音设备名称及PNPDeviceID

    实现效果: 知识运用: WMI管理类中的 ManagementObjectSearcher类 //基于指定的查询检索管理对象的集合 用于检索管理信息的较为常用的入口点之一 public Managem ...

  6. Java中的BIO,NIO,AIO分别是什么

    BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善.BIO方式适用 ...

  7. sqlserver还原3101

    1.出现错误"3101" 2.解决办法:删除数据库之后还原(有风险)或者获得数据库的独占访问权(用sql语句) 参考:https://www.2cto.com/database/2 ...

  8. cf上分的失落->高兴->更失落

    cf昨日做出一个题居然div2打了1800多名直接上分了...我原以为垂直落地但是....我现在1399差一分就能蓝名了啊啊啊啊,以后不一定会有这个水平的啊,给个蓝名体验卡不行吗,多加一分会死啊... ...

  9. vue 框架原理

    参考:https://segmentfault.com/a/1190000006599500#articleHeader4 记录自己的理解: 核心的响应原理通过Object.definePropert ...

  10. 【模板】CDQ分治

    __stdcall大佬的讲解 这里贴的代码写的是点修改.区间查询的题. #include<cstdio> #include<cstring> #include<algor ...