20201214-1 Json与pickle数据序列化
- 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数据序列化的更多相关文章
- Python基础4 迭代器,生成器,装饰器,Json和pickle 数据序列化
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- python入门之json与pickle数据序列化
前提实例: 将一个字典存放在文件里 #存入数据info = { 'name':'chy', 'age':18 } f = open("test.txt","w" ...
- Python-Day4 Python基础进阶之生成器/迭代器/装饰器/Json & pickle 数据序列化
一.生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面 ...
- python基础6之迭代器&生成器、json&pickle数据序列化
内容概要: 一.生成器 二.迭代器 三.json&pickle数据序列化 一.生成器generator 在学习生成器之前我们先了解下列表生成式,现在生产一个这样的列表[0,2,4,6,8,10 ...
- 迭代器/生成器/装饰器 /Json & pickle 数据序列化
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- Python之路-python(装饰器、生成器、迭代器、Json & pickle 数据序列化、软件目录结构规范)
装饰器: 首先来认识一下python函数, 定义:本质是函数(功能是装饰其它函数),为其它函数添加附件功能 原则: 1.不能修改被装饰的函数的源代码. 2.不 ...
- json&pickle数据序列化模块
用于序列化的模块 json,通用的序列化方式,序列化成为str类型,支持所有语言识别,序列化的数据具有局限性. pickle,python的所有数据类型都可以被序列化,序列化为bites格式,只适用于 ...
- day04 装饰器 迭代器&生成器 Json & pickle 数据序列化 内置函数
回顾下上次的内容 转码过程: 先decode 为 Unicode(万国码 ) 然后encode 成需要的格式 3.0 默认是Unicode 不是UTF-8 所以不需要指定 如果非要转为U ...
- Json & pickle 数据序列化
前提: 文本文件中只能写入字符串或ascii码格式的内容. info={'name':'zoe','age':18} f=open('test.txt','w') f.write(info) #在文本 ...
随机推荐
- Python_爬虫_百度图片
百度图片有些有编码问题,暂时不能爬取,多试几个 #思路:抓取图片地址,根据地址转存图片(注意名称):难点:转码 # -*- coding:utf-8 -*- from urllib import re ...
- c++11-17 模板核心知识(八)—— enable_if<>与SFINAE
引子 使用enable_if<>禁用模板 enable_if<>实例 使用Concepts简化enable_if<> SFINAE (Substitution Fa ...
- PVE 下的虚拟机磁盘扩容
扩容背景:一台测试机磁盘不足,需要扩容: /dev/mapper/centos-root 40G 40G 20K 100% / 先到PVE网页上对需要扩容的机器扩容,这里新建20G示例: 另外之前也分 ...
- zabbix、Cacti、Nagios、open-falcon、Ganglia、Prometheus开源监控比较
Zabbix 一个基与WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案(普遍) 能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...
- 到底为什么不要用SELECT *
SELECT * 无论工作还是面试,说到sql优化,比说的一个问题就是,代码中sql不要出现 SELECT *,之前一直也没有深入去研究研究,为什么,只是记住了,代码中注意了,但是就在今天逛某某论坛时 ...
- Mac虚拟环境安装django
安装:pip3 install virtualenv 创建:Virtualenv env01 激活:Source env01/bin/activate django安装:pip3 install dj ...
- jmeter压测mysql数据库
jmeter连接并压测mysql数据库,之前一直想用jmeter一下测试mysql数据库的性能,今天偶然看到一篇博客,于是乎开始自己动手实践. 一.准备工作 1.安装好mysql数据库,可以安装在本地 ...
- 聊聊kafka-client的源码
一,感想 kafka 客户端代码很早以前 我就想研究借鉴一下,我前前后后至少阅读过三遍源码,我发现我看不下去,不知道为啥这么写,在次期间,我也参考了很多的网上的源码分析,我发现自己依然一知半解的, 慢 ...
- Mac 安装Homebrew慢的问题解决
一开始安装,在官网上的命令: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...
- 【线程池】自己声明临时线程池一定要shutdown!
场景: 某个定时任务需要多线程执行,执行时间较久且每天只跑一次,想单独拉出一个线程池和其他业务隔离开,交给spring会导致核心线程一直存在 浪费线程资源,因此想单独拉一个池子用完就丢,原本想的是,在 ...