序列化和反序列化-json/pickle

基于车辆运动学的规划算法 - Hybrid A*/ State Lattice Planning (前置知识:自行车模型、Dubins、Reeds Shepp、多项式曲线、螺旋曲线) 本文将按顺序讲解基于车辆运动学的规划算法,以及需要的前置知识:自行车模型、Dubins和Reeds Shepp曲线、多项式曲线和螺旋曲线 阅读详情
什么叫序列化——
     将原本的字典、列表等内容转换成一个字符串的过程就叫做------序列化。

为什么要有序列化模块?

比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?
一种方法就是存在文件里,然后另一个python程序再从文件里读出来。
但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。
你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?
没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串,
但是你要怎么把一个字符串转换成字典呢?
聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。
eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。
BUT!强大的函数有代价正如我之前博客https://blog.youkuaiyun.com/wbj_code_life/article/details/101065462深度解析eval和exec。安全性是其最大的缺点。
想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。
而使用eval就要担这个风险。
所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)

序列化的目的

1、以某种存储形式使自定义对象持久化即当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

2、当你想用套接字在网络上传输对象时。那么什么是套接字呢?

传输层实现端到端的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是主机,不是主机的IP地址,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。

总之,套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。

套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。因此,两个应用程序之间的数据传输要通过套接字来完成。

在网络应用程序设计时,由于TCP/IP的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现。在Windows环境下,网络应用程序编程接口称作Windows Socket。为了支持用户开发面向应用的通信程序,大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)。

     3当你想通过RMI调用对象时

    (RMI是什么东西?):RMI总结来说就是远程调用对象,在一个jvm上调用另一个jvm的对象。

json

Json模块提供了四个功能:dumps、dump、loads、load

loads和dumps

import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json转换完的字符串类型的字典中的字符串是由""表示的(双引号)

dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
#注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}


list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]

load和dump

import json
f = open('json_file','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
f.close()

f = open('json_file')
dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
f.close()
print(type(dic2),dic2)
import json
f = open('file','w')
json.dump({'国籍':'中国'},f)
ret = json.dumps({'国籍':'中国'})
f.write(ret+'\n')
json.dump({'国籍':'美国'},f,ensure_ascii=False)
ret = json.dumps({'国籍':'美国'},ensure_ascii=False)
f.write(ret+'\n')
f.close()

其他具体参数说明:

Serialize obj to a JSON formatted str.(字符串表示的json对象) 

Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key

ensure_ascii:,当它为True的时候,所有非ASCII码字符显示为\uXXXX序列,只需在dump时将ensure_ascii设置为False即可,此时存入json的中文即可正常显示。) 
If check_circular is false, then the circular reference check for container types will be skipped and a circular reference will result in an OverflowError (or worse). 
If allow_nan is false, then it will be a ValueError to serialize out of range float values (nan, inf, -inf) in strict compliance of the JSON specification, instead of using the JavaScript equivalents (NaN, Infinity, -Infinity). 

indent:应该是一个非负的整型,如果是0就是顶格分行显示,如果为空就是一行最紧凑显示,否则会换行且按照indent的数值显示前面的空白分行显示,这样打印出来的json数据也叫pretty-printed json 

separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(‘,’,’:’);这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开。 
default(obj) is a function that should return a serializable version of obj or raise TypeError. The default simply raises TypeError. 

sort_keys:将数据根据keys的值进行排序。 
To use a custom JSONEncoder subclass (e.g. one that overrides the .default() method to serialize additional types), specify it with the cls kwarg; otherwise JSONEncoder is used.

 

json格式化输出

import json
data = {'username':['李华','二愣子'],'sex':'male','age':16}
json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False)
print(json_dic2)

 

 

pickle

用于序列化的两个模块

  • json,用于字符串 和 python数据类型间进行转换
  • pickle,用于python特有的类型 和 python的数据类型间进行转换

pickle模块提供了四个功能:dumps、dump(序列化,存)、loads(反序列化,读)、load  (不仅可以序列化字典,列表...可以把python中任意的数据类型序列化)

import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic)  #一串二进制内容(bytes类型)

dic2 = pickle.loads(str_dic)
print(dic2)    #字典

import time
struct_time  = time.localtime(1000000000)
print(struct_time)
f = open('pickle_file','wb')
pickle.dump(struct_time,f)
f.close()

f = open('pickle_file','rb')
struct_time2 = pickle.load(f)
print(struct_time2.tm_year)

这时候机智的你又要说了,既然pickle如此强大,为什么还要学json呢?
这里我们要说明一下,json是一种所有的语言都可以识别的数据结构。
如果我们将一个字典或者序列化成了一个json存在文件里,那么java代码或者js代码也可以拿来用。
但是如果我们用pickle进行序列化,其他语言就不能读懂这是什么了~
所以,如果你序列化的内容是列表或者字典,我们非常推荐你使用json模块
但如果出于某种原因你不得不序列化其他的数据类型,而未来你还会用python对这个数据进行反序列化的话,那么就可以使用pickle

 

 

 

 

 

 

 

MacOS多次踩坑后成功安装Homebrew 来一次性成功安装Homebrew吧 官网提供的安装脚本无法成功安装Homebrew,原因大家都懂的,故采用脚本安装的方式。 下载homebrew的安装脚本brew_install 在Download路径下执行如下脚本 curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install >> brew_install 修改brew_install脚本 修改brew_install脚本。如果你的脚本打开之后是如下 阅读详情

相关推荐

VS2017配置PCL1.9.1 for win10(超详细)

准备工作 VS2017 自行下载 PCL1.9.1 点击链接跳转Github下载,根据自己的环境选择 win64或win32,作者下载的是:PCL-1.9.1-AllInOne-msvc2017-win64.exepcl-1.9.1-pdb-msvc2017-win64.zip 安装PCL 双击点开PCL-1.9.1-AllInOne-msvc2017-win64.exe,选择Add PCL to the system PATH for all users, 更改安装路径,E:\Progra

malapoa的博客 1146

Python&Java之序列化&反序列化

首先什么叫序列化和反序列化? 序列化:将对象转化为字节的过程。 反序列化:将字节/文件转为对象过程。 作用: 这样可以永久存储,文件,数据库,远程传输,你不可能把内存传输或者保存的吧? Java序列化: Java想要对类实现序列化,首先要实现一个接口(Serializable),不然会报错哦。 序列化首先要有这个对象(这个对象已经被实例化了),我们这里new了一个学术类 Stud...

qq_34939975的博客 1929

flink定位反压节点

在 Apache Flink 中定位反压(Backpressure)节点需要结合监控工具和作业行为分析。

2301_80954266的博客 1047

【python库】序列化和反序列化、json/pickle

文章目录什么是序列化?为什么要序列化?jsonpickle 序列化模块 序列化方法 格式转换 把python中的数据转换成str—序列化 可以str转换成python的数据—反序列化 什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。 为什么要序列化? 持久保存状态 需知一个软件/程序的执行就在处理一系列状态的变化,在编程语

qq_36581961的博客 591

保姆级教程:手把手教你用RKISP TURN为RV1106生成和配置IQfile(附AIQ版本匹配避坑指南)

本文提供RV1106 ISP调试的完整指南,详细讲解如何使用RKISP TURN工具生成和配置IQfile,包括环境搭建、参数调试、设备树配置及常见问题解决方案。特别强调AIQ版本匹配的重要性,帮助开发者避免常见陷阱,提升图像信号处理效率。

weixin_42520796的博客 492

金属粘结剂喷射3D打印技术:工艺流程与后处理关键

金属粘结剂喷射(Binder Jetting)是一种创新的增材制造技术,通过逐层喷射粘合剂将金属粉末粘结成型,再经过脱脂和烧结等后处理工序获得最终零件。这项技术的核心优势在于无需支撑结构、可实现批量生产,并且材料利用率高。在3D打印领域,金属BJ技术特别适合中小尺寸、结构复杂且表面质量要求高的零件生产。其工艺流程包括前期数据处理、打印生胚阶段、拆包与清粉,以及关键的渗透、脱脂和烧结后处理环节。后处理工艺的控制直接决定了零件的机械性能和尺寸精度,其中烧结工艺尤为关键,需要精确控制温度曲线和气氛环境。金属BJ打

weixin_35751194的博客 84

python全栈 序列化和反序列化 json/pickle

序列化的概念 序列化:内存中的数据类型转换成特定格式的内容,该格式的内容可用于存储或者传输给其他的平台使用。 反序列化:特定格式的内容转换成内存中的数据类型 序列化的用途 1.可用于存档 2.传输给其他平台使用 -- 跨平台数据交互 强调: 针对用途1的特定格式:一种专用的格式 -- pickle只有python可以识别 针对用途2的特定格式:一种通用的能够被所有的编程语言识别的格式 -- json JSON PYTHON 对应数据类型 如何序列化和反序列化 import json # 序列化

return_2的博客 178

手把手教你设计T型和Π型衰减器:从分贝计算到电阻选型全攻略

本文提供了一份T型和Π型衰减器的详细设计指南,涵盖从分贝计算到电阻选型的全过程。文章以50欧姆系统为例,通过公式推导和实例演示,手把手教你计算两种经典拓扑的电阻值,并深入探讨了电阻选型、误差控制及高频应用等关键实践技巧,帮助工程师和爱好者精准实现信号衰减与阻抗匹配。

blue42的博客 1337

Python基础-json和pickle序列化/反序列化

首先引入json模块 序列化:使用json的dumps方法 反序列化:使用json的loads方法 过程:在json序列化后就可以将序列化的数据类型写入文件,然后在从文件中读出该数据类型,然后在进行反序列化 json对象中的其他的方法:dump(info,f)>>>其中Info是需要序列化的数据,f是一个文件句柄;load(f)>>>使用这两个方法不要在...

weixin_30363981的博客 81

Cadence PSpice 仿真0:绘制电路图方法图文教程

在使用PSpice进行电路的仿真时,首先需要使用带有PSpice模型的元器件来绘制电路图,本文简单介绍进行电路图绘制是常用的几种需要掌握的方法,以满足PSpice仿真绘制简单电路图所用。

fydar的博客 4707

【AIGC】大模型面试高频考点09-大模型Agent框架

聚焦AIGC专业技术分享

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1967

python加密数据文件——文件操作——文件的读和写——pickle自带模块/json自带模块——序列化字符串/反序列化字符串

目录 1.pickle 1.简介 2.使用方法 3.实例 2.json 1.简介 2.使用方法 _____________________________________________________________________________ 1.pickle 1.简介 模块pickle实现了对一个 Python 对象结构的二进制序列化和反序列化。"pickling"是将 Python 对象...

ljl20120815的博客 315

RV1126 ISP调参实战:3A算法参数调节的7个技巧

││ │ DEMOSAIC (去马赛克) │ ││ │ GAMMA (Gamma 校正) │ ││ │ DPC (坏点校正) │ ││。

小灰灰的博客 665

Python-序列化与反序列化_python pb反序列化

序列化。

2401_87373456的博客 1070

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

python: 序列化/反序列化及漏洞分析

python: 序列化/反序列化及对象的深拷贝/浅拷贝 一、序列化/反序列化 python中内置了很多序列化/反序列化的方式,最常用的有json、pickle、marshal这三种,示例用法如下: import json import pickle import marshal author1 = {"name": "菩提树下的杨过", "blog": "http://yjmyzz.cnblo...

YSS_33521的博客 1794

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【5.0】常用模块之json、pickle模块

【一】序列化和反序列化 【1】什么是序列化 将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。 【2】为什么要有序列化 比如,我们在 python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给? 现在我们能想到的方法就是存在文件里 然后另一个 python 程序再从文件里读出来。 但是我们都知道 对于文件来说是没有字典这个概念的 所以我们只能将数据转换成字典放到...

Chimengmeng的博客 906

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python中的序列化与反序列化,python序列化与反序列化(json、pickle)

1.什么是序列化&反序列化?序列化:将字典、列表、类的实例对象等内容转换成一个字符串的过程。反序列化:将一个字符串转换成字典、列表、类的实例对象等内容的过程PS:Python中常见的数据结构可以统称为容器。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。场景一:我们在python中将一个功能给另外一段程序使用,怎么给?方法一:功能存到文件,然后另一个python程序...

weixin_39745724的博客 759

【从零学习python 】55.Python中的序列化和反序列化,JSON与pickle模块的应用

本文介绍了在Python中使用JSON和pickle模块进行序列化和反序列化的方法。JSON是一种轻量级的数据交换格式,可以将对象转换为字符串,并实现对象的序列化和反序列化操作。通过json.dumps()和json.loads()方法,可以将对象转换为JSON字符串,或从JSON字符串中恢复对象。同时,JSON还提供了dump()和load()方法,可以将对象直接写入文件或从文件中读取。 与JSON不同,pickle模块将对象转换为二进制格式进行序列化。pickle.dump()和pickle.load

全栈若城,专注知识分享 2599

序列化和反序列化的定义

序列化和反序列化的定义 序列化:把不可传输的对象转换成可存储或可传输的过程 反序列化:把磁盘等介质中的数据转换成对象 pickle模块(二进制格式之间的转换) 序列化:dump(object)和dumps(object) 反序列化:load(bytes)和loads(bytes) 不带s的是(反)序列化二进制文件,带s的是(反)序列化对象 1. dumps()和loads()对对象进行...

黄雄进 380

html源码用json序列化,序列化模块json代码实例详解

序列化模块json代码实例详解发布时间:2020-09-01 05:28:04来源:脚本之家阅读:123作者:lxingchenjson 模块json 是一种通用的数据传输格式,本质就是一个字符串json 要求 {'key':value}key必须是字符串,value只能是: 字典,列表,字符串,数字,bool值在任何语言中他的type都必须是字符串类型json是所有的变成语言都公认的一种数据类型...

weixin_39870092的博客 274

序列化性能对比:JSON、Pickle、MessagePack、Avro、Protobuf谁更快?

对比主流Python序列化技术性能,深入分析JSON、Pickle、MessagePack、Avro与Protobuf在不同场景下的序列化速度、空间效率及适用场景,帮助开发者选型优化。涵盖实际测试方法与结果解读,提升数据传输与存储效率,值得收藏。

IterLoom的博客 1034

python sys模块讲解_python模块之sys模块和序列化模块(实例讲解)

sys模块sys模块是与python解释器交互的一个接口sys.argv 命令行参数List,第一个元素是程序本身路径sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1)sys.version 获取Python解释程序的版本信息sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值sys.platform 返回操作系统...

weixin_31659095的博客 156

Python对象序列化和反序列化方法总结

在Python中,序列化和反序列化对象有多种方法。

weixin_41312759的博客 393

python序列化对象中的对象_python: 序列化/反序列化及对象的深拷贝/浅拷贝

一、序列化/反序列化python中内置了很多序列化/反序列化的方式,最常用的有json、pickle、marshal这三种,示例用法如下:import jsonimport pickleimport marshalauthor1 = {"name": "菩提树下的杨过", "blog": "http://yjmyzz.cnblogs.com/", "title": "架构师", "pets": [...

weixin_39682697的博客 148

python 0220 序列化、反序列化

目录 pickle 模块 序列化反序列化 参考https://www.cnblogs.com/yyds/p/6563608.html import json import demjson as demjson data = {"a": "str", "c": True, "b": 11.1, "e": 10, "d": None, "g": [4, 5, 6], "f": [1, 2, 3]} # ddata = json.dumps(data,sort_keys=True, separato

chuanying_xiaoqi的博客 236

序列化模块、pickle模块、hashlib模块

什么是序列化,就是将原本的字典、列表等内容转换成json字符串的过程就叫 序列化。什么是反序列化,就是将json字符串转为其他数据类型的过程就是 反序列化。为何要有序列化模块。

冰冰凉沉甸甸的博客 134
上一篇: python中如何判断哪些是类哪些是内置函数呢?
下一篇: TCP协议与UDP协议之间的九个区别
raw_recruit0302
博客等级 码龄8年 30粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值