json&pickle模块

在没学模块前,我们通常使用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型eval都能用,但遇到特殊类型的数据时,eval就不管用了,所以eval的重点还是通常用来执行一个字符串表达式,并返回表达式的值

序列化

序列化是把对象(变量)从内存中变成可存储或传输的过程,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是相同的意思

序列化的原因

①持久保存状态(数据)

需知一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,'状态'会以各种各样有结构的数据类型(也可简单的理解为变量)的形式被保存在内存中内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(结构)都被清空了。

在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化

②跨平台、跨语言数据交互

序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互

反序列化

与序列化相反,把变量内容从序列化的对象重新读到内存里转成某一语言的数据类型称之为反序列化,即unpickling。

ps:java中,出于性能的考虑,有很多包来完成序列化和反序列化,如谷歌的gson 阿里开源fastjson

json模块

如果要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON

原因:

  • JSON表示出来就是一个字符串,可以被所有语言读取
  • 可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便

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

json和python之间的对应数据格式

json模块的使用

import json  #json是python的内置模块,直接导入dic={'name':'alvin','age':23,'sex':'male'}
print(type(dic))  #<class 'dict'>#-----------------------------序列化
j=json.dumps(dic) # dumps方法是将dic的数据转换为json格式字符串
print(type(j))  #<class 'str'># 以json格式字符串写入文件中保存
with open("a.txt",mode="wt",encoding="utf-8") as f :json.dump(dic,f)#-----------------------------反序列化<br>
dic1=json.loads(j) # loads方法是将json格式字符串转换为dic的字典形式数据
print(type(dic1))  #<class 'dict'># 将以json格式字符串保存的文件内容读到内存
with open("a.txt", mode="rt", encoding="utf-8") as f1:data = json.load(f1)

无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads

json模块的注意点

  • dumps的对象外层只能是字典,列表或布尔值,当然字符串也是可以的,内层不能有集合或其他特殊数据类型
  • loads,load的对象格式必须是json格式,否则就会报错(json格式中没有单引号)

补充:

import json
dic = {'name': '佛挡杀佛', 'age': 18, 'handsome': True, 'xxx': None}
print(json.dumps(dic,ensure_ascii=False)) #如数据中有中文,可以加上ensure_ascii=False,可以更加清晰
print(json.dumps(dic))  # 如果不加,转化的格式是Unicode格式运行结果:
{"name": "佛挡杀佛", "age": 18, "handsome": true, "xxx": null}
{"name": "u4f5bu6321u6740u4f5b", "age": 18, "handsome": true, "xxx": null}

pickle模块

pickle转换后的格式是bytes类型

pickle的使用

import pickle   # pickle是内置模块#pickle序列化dic={'name':'sak','age':18}
res=pickle.dumps(dic) # dumps方法是将dic的数据转换为bytes格式# pickle的反序列化b=b'x80x04x95x1ax00x00x00x00x00x00x00}x94(x8cx04namex94x8cx03lqzx94x8cx03agex94Kx12u.'
res=pickle.loads(b) # loads方法是将bytes格式转换为dic的字典形式数据#文件+序列化dic={'name':'sak','age':18}
with open('a.pkl','wb') as f:pickle.dump(dic,f)  # 以bytes格式写入文件中保存#文件+反序列化with open('a.pkl','rb') as f:res=pickle.load(f)  # 将以bytes格式保存的文件内容读到内存转化为原本的数据格式

python2与python3的pickle兼容性问题

# 在python3中执行的序列化操作时,由于python2不支持protocol>2,默认python3中protocol=4,所以在python3中dump操作应该指定protocol=2
pickle.dump('你好啊',f,protocol=2)
# 这样python2中的反序列化就能正常使用

Pickle的问题就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,一般只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系

比较pickle和json

  • json:通用格式,任何语言都可以解析,但是能转换的数据类型有限(只能是字典、列表、布尔值)
  • pickle:只能python使用,转成bytes格式,其它语言识别不了,但任意的数据类型都可以转换

activiti 条件表达式json报错_json模块和pickle模块相关推荐

  1. activiti 条件表达式json报错_2020年2月13日学习python 条件控制

    2020年2月13日学习python 条件控制 所谓条件(condition):指的是成立的条件,即返回值是True的布尔表达式. 运行报错: def account_login(): passwor ...

  2. vite配置别名,并处理报错:找不到模块“xxx”或其相应的类型声明

    vite配置别名,并处理报错:找不到模块"xxx"或其相应的类型声明 1.配置vite.config.ts文件 2.配置tsconfig.json文件 1.配置vite.confi ...

  3. vue3 报错提示 找不到模块“./XXX.vue”或其相应的类型声明

    vue3 报错提示 找不到模块"./XXX.vue"或其相应的类型声明 从网上找了好多方法比如在tsconfig文件下增加: {"compilerOptions" ...

  4. python爬取有道词典json报错,求帮助!

    python爬取有道词典json报错,求帮助! import urllib.request import urllib.parse import json import time import ran ...

  5. python中pickle模块的用法_Python中json模块和pickle模块的简单介绍(附示例)

    本篇文章给大家带来的内容是关于Python中json模块和pickle模块的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Python中的json模块和pickl ...

  6. 初学者python笔记(json模块、pickle模块、xml模块、shelve模块)

    文章目录 json模块 正常数据转化(复杂) json模块的相关操作 pickle模块 shelve模块 xml模块 在Python中,json模块.pickle模块.xml模块.shelve模块这四 ...

  7. vue3+vite+ts报错:找不到模块“@/xxxxxx”或其相应的类型声明。

    场景:引入ts文件报错找不到相应类型声明,此时是tsconfig.json文件还要进行文件系统路径别名设置 {"compilerOptions": {"baseUrl&q ...

  8. python response.json()报错_Django JsonResponse json格式报错 解决Django响应JsonResponse返回json格式数据报错问题...

    想了解解决Django响应JsonResponse返回json格式数据报错问题的相关内容吗,彭世瑜在本文为您仔细讲解Django JsonResponse json格式报错的相关知识和一些Code实例 ...

  9. python response.json()报错_解决Django响应JsonResponse返回json格式数据报错问题

    解决Django响应JsonResponse返回json格式数据报错问题,给大家,报错,代码,图书,希望能 解决Django响应JsonResponse返回json格式数据报错问题 易采站长站,站长之 ...

最新文章

  1. Brocade说:网络就是云
  2. 剑指offer47 不用加减乘除做加法
  3. 经典|Linux:为什么性能工具需要 BPF 技术(送多本)
  4. dubbo调用超时回滚_如何处理Dubbo调用超时?
  5. 富士康java应届生工资待遇_应届毕业生入职富士康渠道不一样,收入相差悬殊...
  6. rtx2060什么水平_不出预料+不负众望,NVIDIA RTX2060显卡获得2019我最喜欢称号
  7. 百度下载工具我用这两个(目前)
  8. 王兴191条思考:一个顶级创始人的修炼与洞察
  9. 斐波那契堆(Fibonacci Heap)
  10. Java之T分布计算数据的双侧置信区间
  11. 用c语言软件制作监察病毒,弄了个病毒。用的是C语言,大家看看!
  12. Linux面试题1.只查看ett.txt文件(100)中的第20到第30行的内容
  13. 业务流程再造理论的起源、演进及发展趋势
  14. PLC是怎么工作和扫描的
  15. FairyGUI基础学习笔记
  16. Oracle 使用DBMS_JOB和DBMS_SCHEDULER 创建定时任务 创建管理job示例
  17. 十年磨一剑,剑指IT技术之巅,WOT 全球技术创新大会 2022盛大开启
  18. 从零开发一个非常有意思的 Python 项目:电子考勤系统
  19. 360 压缩终于庐山真面目了
  20. 中国汽车仪表玻璃市场运行分析与投资前景预测报告2022-2028年

热门文章

  1. 今后,去踢“大数据足球”
  2. Storm概念学习系列之Stream消息流 和 Stream Grouping 消息流组
  3. how tomcat works 读书笔记(一)----------一个简单的webserver
  4. 16muduo_base库源码分析(七)
  5. java扫描局域网中可用ip_使用java线程扫描局域网ip简单方案
  6. docker pull下载很慢_假如服务器上没有 Docker 环境,你还能愉快的拉取容器镜像吗?...
  7. Python基础篇:常见常用且要常记得的数据类型--列表
  8. HALCON 21.11:深度学习笔记---异常检测(9)
  9. 常见印花疵点及产生原因
  10. DBUtils的概述