1-1
文件处理时,只能存字符串或者二进制 info = {
'name':'alex',
'age':22
}
f = open("test.text", "w")
f.write(info)
f.close() --->
Traceback (most recent call last):
TypeError: write() argument must be str, not dict
1-1-1
那么就改成字符串 info = {
'name':'alex',
'age':22
}
f = open("test.text", "w")
f.write(str(info))
f.close() 成功存进去了
把字典这种内存的数据类型,通过字符串存到硬盘上了,这个过程叫序列化
序列化就是把内存的数据类型,变成字符串了 有序列化就有反序列化,反序列化就是加载回来
1-1-2
在一个新的程序里,打开刚才的文件
f = open("test.text","r")
data = eval(f.read())
f.close()
print(data['age'])
--->
22
这种方式,也可以用 但是 eval 不是通用的东西,一种更标准更通用的方式是 Json
1-2
import json info = {
'name':'alex',
'age':22
}
f = open("test.text", "w")
print(json.dumps(info))
--->
{"name": "alex", "age": 22} 序列化的时候,不建议用 str,low
打印结果也是变成字符串了
1-2-1
现在可以将结果写进去
import json info = {
'name':'alex',
'age':22
}
f = open("test.text", "w")
f.write(json.dumps(info))
f.close()
1-3
反序列化时
import json
f = open("test.text","r")
data = json.loads(f.read()) print(data["age"])
--->
22
序列化用 dumps 反序列化用 loads
实现将内存数据对象存入硬盘,并读回来的功能
2-1
import json def sayhi(name):
print("hello, ", name) # 现在将这个函数的内存地址当做一个 key info = {
'name':'alex',
'age':22,
'func':sayhi # 不要调用,调用就直接返回结果了,这是一个内存地址
} f = open("test.text", "w")
f.write(json.dumps(info))
f.close()
--->
TypeError: Object of type function is not JSON serializable 这不是可序列化的 json 类型,json 只能处理简单数据类型,字典,列表,字符串等
json 是所有语言里面都通用的,所有语言都支持 json
json 主要是用于不同语言之间的数据交互, 所以 json 只默认支持最简单的类型
xml 和 json 的作用是一样的, xml 正在逐渐被 json 取代
xml 是一种标记式语言
2-1-1
现在如果处理复杂的数据类型,应该怎么办?
pickle 用法和 json 是完全一样的
import pickle
def sayhi(name):
print("hello, ", name) 现在将这个函数的内存地址当做一个 key info = {
'name':'alex',
'age':22,
'func':sayhi 不要调用,调用就直接返回结果了,这是一个内存地址
} f = open("test.text", "w")
f.write(pickle.dumps(info))
f.close() 打印的结果是二进制的,而且需要编码
pickle 有自己的语法规则和映射的对应关系(这不是加密)
2-1-2
import pickle
def sayhi(name):
print("hello, ", name) info = {
'name':'alex',
'age':22,
'func':sayhi
} f = open("test.text", "wb")
f.write(pickle.dumps(info))
f.close()
2-1-3
反序列化也是一样的
用rb
import pickle
f = open("test.text","rb") data = pickle.loads(f.read()) print(data)
--->
AttributeError: Can't get attribute 'sayhi' on <module '__main__' from 'c:\\Us 原因是 虽然 序列化时把内存地址序列化进去了
sayhi 的内存地址,伴随程序执行结束后,就释放了,对象就找不到了
反序列化时,是找不到这个地址的 pickle 可以用于 python 的所有数据类型
2-1-4
import pickle def sayhi(name):
print("hello,",name) f = open("test.text","rb") data = pickle.loads(f.read()) print(data)
--->
{'name': 'alex', 'age': 22, 'func': <function sayhi at 0x0000000001E5C1E0>}
2-1-5
import pickle def sayhi(name):
print("hello,",name) f = open("test.text","rb") data = pickle.loads(f.read()) print(data["func"]("Alex"))
--->
hello, Alex
None
2-2
如果序列化和反序列化的对象,只是名字一样
反序列化时,多加了一个内容,或者替换了内容,能够对应吗?
import pickle def sayhi(name):
print("hello2,",name) f = open("test.text","rb") data = pickle.loads(f.read()) print(data["func"]("Alex"))
--->
hello2, Alex
None 说明只要函数名一样,内容可以不一样
因为,序列化时,序列化的不是内存地址,而是整个的内存对象
两个程序中的内存地址不可能一样,因为两个程序是无法互相访问的
函数也可以序列化,这就是 pickle
2-3
pickle 和 json 的区别,pickle 只能支持python本语言,只能在 python 中使用,
java 是不认识 pickle 数据类型的,java 只认识 json
3-1
除了 dump 和 load,其实还有一个方法
可以把 dumps 更简化
dump 的用法是,第一个是 obj 序列号内存对象, 第二个是 文件 import pickle
def sayhi(name):
print("hello, ", name) info = {
'name':'alex',
'age':22,
'func':sayhi
} f = open("test.text", "wb")
pickle.dump(info,f) # f.write(pickle.dumps(info))
# 两种方式是完全一样的,只是不用写 write 了,把文件句柄传进去 f.close()
3-2
反序列化2
有 dump 就有 load import pickle def sayhi(name):
print("hello,",name) f = open("test.text","rb") # data = pickle.loads(f.read())
data = pickle.load(f) print(data["func"]("Alex"))
3-3
可以 dump 两次 或者 三次吗?
import json info = {
'name':'alex',
'age':22
}
f = open("test.text", "w")
f.write(json.dumps(info)) info['age'] = 21
f.write(json.dumps(info))
f.close()
--->
{"name": "alex", "age": 22}{"name": "alex", "age": 21}
改完之后,存入两个字典
3-4
反序列化
import json f = open("test.test","r") data = json.load(f)
print(data) 3.0 中 可以 dump 好多次,但是无法 load 好多次 所以,写程序,只 dump 一次,load 一次;新写入的内容冲掉旧内容
想存多个状态,就 dump 成多个文件

20201214-1 Json与pickle数据序列化的更多相关文章

  1. Python基础4 迭代器,生成器,装饰器,Json和pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  2. python入门之json与pickle数据序列化

    前提实例: 将一个字典存放在文件里 #存入数据info = { 'name':'chy', 'age':18 } f = open("test.txt","w" ...

  3. Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化

    一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...

  4. python基础6之迭代器&生成器、json&pickle数据序列化

    内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...

  5. 迭代器/生成器/装饰器 /Json & pickle 数据序列化

    本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...

  6. Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)

    装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能        原则:        1.不能修改被装饰的函数的源代码.        2.不 ...

  7. json&pickle数据序列化模块

    用于序列化的模块 json,通用的序列化方式,序列化成为str类型,支持所有语言识别,序列化的数据具有局限性. pickle,python的所有数据类型都可以被序列化,序列化为bites格式,只适用于 ...

  8. day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数

    回顾下上次的内容 转码过程: 先decode  为 Unicode(万国码 ) 然后encode 成需要的格式     3.0 默认是Unicode  不是UTF-8 所以不需要指定  如果非要转为U ...

  9. Json & pickle 数据序列化

    前提: 文本文件中只能写入字符串或ascii码格式的内容. info={'name':'zoe','age':18} f=open('test.txt','w') f.write(info) #在文本 ...

随机推荐

  1. 死磕以太坊源码分析之rlpx协议

    死磕以太坊源码分析之rlpx协议 本文主要参考自eth官方文档:rlpx协议 符号 X || Y:表示X和Y的串联 X ^ Y: X和Y按位异或 X[:N]:X的前N个字节 [X, Y, Z, ... ...

  2. shipyard中文版安装教程(附安装脚本)

    一. Docker Shipyard是什么 ? shipyard是一个开源的docker管理平台,其特性主要包括: 支持节点动态集群,可扩展节点的规模(swarm.etcd方案) 支持镜像管理.容器管 ...

  3. ios开发中如何调用苹果自带地图导航

    前段时间一直在赶项目,在外包公司工作就是命苦,天天加班不说,工作都是和工期合同挂钩的,稍微逾期就有可能被扣奖金,不谈这些伤脑筋的事情了,让我们说说iOS开发中如何调用苹果手机自带的地图. 学习如逆水行 ...

  4. 体育成绩统计/ Score

    偏水向,请部分学术控谅解 题目过长,不再描述. 很显然就是一道大模拟对吧,我在这里贡献一下我打此题的思路与过程. 或许有些奇淫巧技可以供一些没有过掉的神犇借鉴一下. 2020.11.26 中午: 昨天 ...

  5. 【AcWing 99】激光炸弹——二维前缀和

    (题面来自AcWing) 一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标. 现在地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi. 激光炸弹的 ...

  6. E. Number of Simple Paths 题解(思维)

    题目链接 题目大意 给你n个点(\(\sum n<=2e5\)),n条边,求有多少条路径 题目思路 要明白任意两点的路径只能是1条或者2条 先topo找环(双向边也是可以找的) 然后把环上的每个 ...

  7. CentOS下的IPMI尝试

    1.载入支持 ipmi 功能的系统模块 modprobe ipmi_msghandler modprobe ipmi_devintf modprobe ipmi_poweroff modprobe i ...

  8. 1. 揭秘Spring类型转换 - 框架设计的基石

    仰不愧天,俯不愧人,内不愧心.关注公众号[BAT的乌托邦],有Spring技术栈.MyBatis.JVM.中间件等小而美的原创专栏供以免费学习.分享.成长,拒绝浅尝辄止.本文已被 https://ww ...

  9. 冲刺随笔——Day_Ten

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...

  10. 以前一个个文件删数据的我,今天终于找到了释放C盘空间的办法

    这是我刚刚清理的C盘,亲测有效!无需安装清理空间的软件,我的电脑品牌是华硕. win10的电脑应该都有搜索功能,如果没有开启,可以鼠标右键点击任务栏. 弹出菜单找到[搜索]-[显示搜索图标],勾选即可 ...