博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
json&pickle序列化
阅读量:6172 次
发布时间:2019-06-21

本文共 3359 字,大约阅读时间需要 11 分钟。

一、简述

我们在写入文件中的数据,只能是字符串,但是如果要想把内存的数据对象存到硬盘上去怎么办呐?下面就来说说序列化:json & pickle

二、json序列化

1、dumps序列化和loads反序列化

dumps()序列化

import  json   #导入json模块 info = {    'name':"seven",    "age":32} with open("test.txt","w") as f:  #以普通模式写入    data = json.dumps(info) #把内存对象转为字符串    f.write(data)   #写到文件中 #text.txt文件中的内容{
"name": "seven", "age": 32}

loads()反序列化

import json with open("test.txt","r") as f:  #以普通模式读    data = json.loads(f.read())   #用loads反序列化 print(data.get("age")) #输出32

2、dump序列化和load反序列化

dump()序列化

import  json info = {    'name':"seven",    "age":32} with open("test.txt","w") as f:   #文件以写的方式打开    json.dump(info,f)    #第1个参数是内存的数据对象 ,第2个参数是文件句柄 #text.txt文件中的内容{
"name": "seven", "age": 32}

load()反序列化

import json with open("test.txt","r") as f:   #以读的方式打开文件    data = json.load(f)  #输入文件对象 print(data["age"]) #输出32

3、序列化函数

import  json def sayhi(name):  #函数    print("name:",name) info = {    'name':"seven",    "age":32,    "func":sayhi    #引用sayhi函数名} with open("test.txt","w") as f:    json.dump(info,f)   #序列化info数据对象 #输出 File "D:\Python\Python35\lib\json\encoder.py", line 403, in _iterencode_dict    yield from chunks  File "D:\Python\Python35\lib\json\encoder.py", line 436, in _iterencode    o = _default(o)  File "D:\Python\Python35\lib\json\encoder.py", line 179, in default    raise TypeError(repr(o) + " is not JSON serializable")TypeError: 
is not JSON serializable #不支持json序列化

小结:

  1. dumps和loads是成对使用的,dump和load是成对使用的。
  2. dumps和loads由于序列化的是内容,所以后面要加s,但是dump和load序列化的内容是对象,所以单数。
  3. json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。
  4. json是所有语言通用的,所有语言都支持json,如果我们需要python跟其他语言进行数据交互,那么就用json格式。

二、pickle序列化

1、dumps序列化和loads反序列化

dumps()序列化

import pickle info = {    'name':"seven",    "age":32,} with open("test.txt","wb") as f:   #以二进制的形式写入    data = pickle.dumps(info)   #序列化成字符串    f.write(data)   #写入test.txt 文件中 #输出到test.txt文件中的内容�}q (X   ageqKX   nameqX   sevenqu.

loads()反序列化

import pickle with open("test.txt","rb") as f: #以二进制的模式读    data = pickle.loads(f.read())   #反序列化操作 print(data.get("age")) #输出32

2、dump序列化和load反序列化

dump()序列化

import pickle info = {    'name':"seven",    "age":32,} with open("test.txt","wb") as f:    pickle.dump(info,f)  #序列化 #输出�}q (X   ageqKX   nameqX   sevenqu.

load()反序列化

import pickle with open("test.txt","rb") as f:    data = pickle.load(f)  #反序列化成内存对象 print(data.get("age")) #输出32

从上面的结果观察,json和pickle好像也没什么区别?但是别忘了,我们说,json只能序列化简单的数据类型,而pickle可以序列化python中所有的数据类型,包括函数、类等,下面我们就来看看,如何序列化函数的。还有就是,pickle序列化的是字节,而json序列化的是字符,这个要注意一下。

3、序列化函数

①序列化

import pickle def sayhi(name):   #函数    print("hello:",name) info = {    'name':"seven",    "age":32,    "func":sayhi    #"func"对应的值sayhi,是函数名} with open("test.txt","wb") as f:    data = pickle.dumps(info)    f.write(data) #输出test.txt�}q (X   funcqc__main__sayhiqX   ageqKX   nameqX   seven.

②反序列化

import pickle def sayhi(name):   #在反序列化中必须写上此函数,不然会报错,因为在加载的时候,函数没有加载到内存    print("hello:",name) with open("test.txt","rb") as f:    data = pickle.loads(f.read()) print(data.get("age")) data.get("func")("seven")  #执行函数sayhi #输出32hello: seven   #输出的函数体中的逻辑也是可以变的,这边我就不做演示了

小结:

  1. json值支持简单的数据类型,pickle支持所有的数据类型。
  2. pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
  3. pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着新的函数体走的。
  4. pickle和json在3.0中只能dump一次和load一次,在2.7里面可以dump多次,load多次,anyway,以后只记住,只需要dump一次,load一次就可以了。

转载于:https://www.cnblogs.com/lin-777/p/7454527.html

你可能感兴趣的文章
hdu4496 D-City(扭转和支票托收啊 )
查看>>
数据挖掘 | 数据理解和预处理
查看>>
关于大数据你必须了解的几个关键词!
查看>>
在Kali Linux中更改GRUB2背景的5种方式
查看>>
如何把Windows 10的“便笺”按钮从操作中心挪到开始菜单和桌面
查看>>
19 个必须知道的 Visual Studio 快捷键
查看>>
如何在Ubuntu命令行下管理浏览器书签
查看>>
《大数据分析原理与实践》一一2.1 大数据分析模型建立方法
查看>>
《 自动化测试最佳实践:来自全球的经典自动化测试案例解析》一一2.7 测试套件和类型...
查看>>
8月18日云栖精选夜读:阿里视频云最强转码技术揭秘:窄带高清原理解析+用户接入指南...
查看>>
涨姿势:工业物联网与大数据融合的四个重点
查看>>
社会学视角下的大数据方法论及其困境
查看>>
《云计算:原理与范式》一1.7 平台即服务供应商
查看>>
百度成立“百度搜索公司”:固本拓新驱动生态裂变
查看>>
宇宙风暴?才怪!瑞典暗指俄罗斯黑客攻击航空控制系统
查看>>
系统进程管理工具Process Explorer
查看>>
富士通仍执着SPARC架构芯片 将坚持推新
查看>>
易宪容:企业要利用大数据挖掘潜在需求
查看>>
微软声称Win10周年更新为Edge浏览器带来更好电池寿命
查看>>
混合云是企业IT的未来吗?
查看>>