一、序列化模块
Python中用于序列化的两个模块:
- json 跨平台跨语言的数据传输格式,用于【字符串】和 【python基本数据类型】 间进行转换
- pickle python内置的数据传输格式,多用于二进制形式,用于【python特有的类型】 和 【python基本数据类型】间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
#pickle.dumps将数据通过特殊的形式转换为只有python能识别的字符串 import pickle data={'k1':123,'k2':'hello'} p_str=pickle.dumps(data) print(p_str) ------->b'\x80\x03}q\x00(X\x02\x00\x00\x00k2q\x01X\x05\x00\x00\x00helloq\x02X\x02\x00\x00\x00k1q\x03K{u.' s = pickle.loads(p_str) print(s) -------->{'k2': 'hello', 'k1': 123} #pickle.dump将数据通过特殊的形式转换为只有python认识的字符串,并写入文件 with open('db','w') as fp: pickle.dump(data,fp) json实例 #json.loads()#将字符串转换成python基本数据类型,注:里面一定要是双引号,外面是单引号 import json s='{"name":"tina","age":"18"}' l='[1,2,3,4]' r=json.loads(l) w=json.loads(s) print(r,type(r)) print(w,type(w)) ############执行结果如下:########### [1, 2, 3, 4] <class 'list'> {'age': '18', 'name': 'tina'} <class 'dict'> #json.dumps()将python的基本数据类型转换成字符串 a={"name":"tina","age":"18"} b=json.dumps(a) print(b,type(b)) #############执行结果如下:########## {"age": "18", "name": "tina"} <class 'str'> #不带s的是对文件进行操作 dic = {'k1':123,'k2':345} a=json.dump(dic,open('db','w')) print(a,type(a)) #读内容 #字符串转换成字典 r=json.load(open('db','r')) print(r,type(r)) #############执行结果如下:########## 写入db文件中的内容即为dict {'k2': 345, 'k1': 123} <class 'dict'>
二、XML
JSON跨平台跨语言的数据传输格式
XML实现不同语言或程序之间进行数据交换的协议
返回的都是字符串,只是不同表现形式的字符串
XML文件格式如下:
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2023</year>
<gdppc>141100</gdppc>
<neighbor direction="E" name="Austria" />
<neighbor direction="W" name="Switzerland" />
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2026</year>
<gdppc>59900</gdppc>
<neighbor direction="N" name="Malaysia" />
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2026</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>
1、解析XML
from xml.etree import ElementTree as ET #打开文件,读取文件内容 str_xml = open('first.xml','r').read() #将文件内容解析成XML格式,root是文件tree的根节点 root=ET.XML(str_xml) print(root.tag) #打印根节点的标签,结果为data print(root) #<Element 'data' at 0x00000057EDD566D8>
方法二: from xml.etree import ElementTree as ET #直接解析XML文件 tree = ET.parse('first.xml') #获取XML文件的根节点 root=tree.getroot() print(root) #<Element 'data' at 0x0000008708517318> print(root.tag) #data #返回结果是一样的
@@@@@@@@@小练习@@@@@@@@ from xml.etree import ElementTree as tina TT = tina.parse('first.xml') print(TT.getroot().tag) #data
2、操作XML
XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:
具体用法举例说明:
(1)遍历XML文档的所有内容
(2) 遍历XML中指定的节点
from xml.etree import ElementTree as ET ############ 解析方式一 ############ """ # 打开文件,读取XML内容 str_xml = open('xo.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(str_xml) """ ############ 解析方式二 ############ # 直接解析xml文件 tree = ET.parse("xo.xml") # 获取xml文件的根节点 root = tree.getroot() ### 操作 # 顶层标签 print(root.tag) # 遍历XML中所有的year节点 for node in root.iter('year'): # 节点的标签名称和内容 print(node.tag, node.text)
from xml.etree import ElementTree as tina TT = tina.parse('first.xml') # print(TT.getroot().tag) # for i in TT.getroot():#在跟节点下遍历孩子标签及属性 # print(i.tag,i.attrib) # for j in i:#在孩子节点下遍历孙子标签及属性 # print(j.tag,j.attrib) #返回结果也是呈树状的,有点像之前三级联动的小练习 for node in TT.getroot().iter('year'): #遍历XML中所有的year节点,类似于Windows中文件夹中全局搜索 print(node.tag,node.text) @@@@@@非注释部分的执行结果如下:@@@@@@@ year 2025 year 2028 year 2028