python3----模块(序列化(json&pickle)+XML+requests)
Posted jonm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3----模块(序列化(json&pickle)+XML+requests)相关的知识,希望对你有一定的参考价值。
一、序列化模块
Python中用于序列化的两个模块:
- json 跨平台跨语言的数据传输格式,用于【字符串】和 【python基本数据类型】 间进行转换
- pickle python内置的数据传输格式,多用于二进制形式,用于【python特有的类型】 和 【python基本数据类型】间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
1 #pickle.dumps将数据通过特殊的形式转换为只有python能识别的字符串 2 import pickle 3 data={\'k1\':123,\'k2\':\'hello\'} 4 p_str=pickle.dumps(data) 5 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.\' 6 s = pickle.loads(p_str) 7 print(s) -------->{\'k2\': \'hello\', \'k1\': 123} 8 #pickle.dump将数据通过特殊的形式转换为只有python认识的字符串,并写入文件 9 with open(\'db\',\'w\') as fp: 10 pickle.dump(data,fp) 11 12 json实例 13 #json.loads()#将字符串转换成python基本数据类型,注:里面一定要是双引号,外面是单引号 14 import json 15 s=\'{"name":"tina","age":"18"}\' 16 l=\'[1,2,3,4]\' 17 r=json.loads(l) 18 w=json.loads(s) 19 print(r,type(r)) 20 print(w,type(w)) 21 ############执行结果如下:########### 22 [1, 2, 3, 4] <class \'list\'> 23 {\'age\': \'18\', \'name\': \'tina\'} <class \'dict\'> 24 #json.dumps()将python的基本数据类型转换成字符串 25 a={"name":"tina","age":"18"} 26 b=json.dumps(a) 27 print(b,type(b)) 28 #############执行结果如下:########## 29 {"age": "18", "name": "tina"} <class \'str\'> 30 31 #不带s的是对文件进行操作 32 dic = {\'k1\':123,\'k2\':345} 33 a=json.dump(dic,open(\'db\',\'w\')) 34 print(a,type(a)) 35 #读内容 36 #字符串转换成字典 37 r=json.load(open(\'db\',\'r\')) 38 print(r,type(r)) 39 #############执行结果如下:########## 40 写入db文件中的内容即为dict 41 {\'k2\': 345, \'k1\': 123} <class \'dict\'>
二、XML
JSON跨平台跨语言的数据传输格式
1 <data> 2 <country name="Liechtenstein"> 3 <rank updated="yes">2</rank> 4 <year>2023</year> 5 <gdppc>141100</gdppc> 6 <neighbor direction="E" name="Austria" /> 7 <neighbor direction="W" name="Switzerland" /> 8 </country> 9 <country name="Singapore"> 10 <rank updated="yes">5</rank> 11 <year>2026</year> 12 <gdppc>59900</gdppc> 13 <neighbor direction="N" name="Malaysia" /> 14 </country> 15 <country name="Panama"> 16 <rank updated="yes">69</rank> 17 <year>2026</year> 18 <gdppc>13600</gdppc> 19 <neighbor direction="W" name="Costa Rica" /> 20 <neighbor direction="E" name="Colombia" /> 21 </country> 22 </data>
1、解析XML
1 from xml.etree import ElementTree as ET 2 #打开文件,读取文件内容 3 str_xml = open(\'first.xml\',\'r\').read() 4 #将文件内容解析成XML格式,root是文件tree的根节点 5 root=ET.XML(str_xml) 6 print(root.tag) #打印根节点的标签,结果为data 7 print(root) #<Element \'data\' at 0x00000057EDD566D8>
1 方法二: 2 from xml.etree import ElementTree as ET 3 #直接解析XML文件 4 tree = ET.parse(\'first.xml\') 5 #获取XML文件的根节点 6 root=tree.getroot() 7 print(root) #<Element \'data\' at 0x0000008708517318> 8 print(root.tag) #data 9 #返回结果是一样的
1 @@@@@@@@@小练习@@@@@@@@ 2 from xml.etree import ElementTree as tina 3 TT = tina.parse(\'first.xml\') 4 print(TT.getroot().tag) #data
2、操作XML
XML格式类型是节点嵌套节点,对于每一个节点均有以下功能,以便对当前节点进行操作:
具体用法举例说明:
(1)遍历XML文档的所有内容
(2) 遍历XML中指定的节点
1 from xml.etree import ElementTree as ET 2 3 ############ 解析方式一 ############ 4 """ 5 # 打开文件,读取XML内容 6 str_xml = open(\'xo.xml\', \'r\').read() 7 8 # 将字符串解析成xml特殊对象,root代指xml文件的根节点 9 root = ET.XML(str_xml) 10 """ 11 ############ 解析方式二 ############ 12 13 # 直接解析xml文件 14 tree = ET.parse("xo.xml") 15 16 # 获取xml文件的根节点 17 root = tree.getroot() 18 19 20 ### 操作 21 22 # 顶层标签 23 print(root.tag) 24 25 26 # 遍历XML中所有的year节点 27 for node in root.iter(\'year\'): 28 # 节点的标签名称和内容 29 print(node.tag, node.text) 30 31 eg1
1 from xml.etree import ElementTree as tina 2 TT = tina.parse(\'first.xml\') 3 # print(TT.getroot().tag) 4 # for i in TT.getroot():#在跟节点下遍历孩子标签及属性 5 # print(i.tag,i.attrib) 6 # for j in i:#在孩子节点下遍历孙子标签及属性 7 # print(j.tag,j.attrib) 8 #返回结果也是呈树状的,有点像之前三级联动的小练习 9 for node in TT.getroot().iter(\'year\'): 10 #遍历XML中所有的year节点,类似于Windows中文件夹中全局搜索 11 print(node.tag,node.text) 12 @@@@@@非注释部分的执行结果如下:@@@@@@@ 13 year 2025 14 year 2028 15 year 2028 16 17 eg2
(3)修改节点内容
3、创建XML文档
1 from xml.etree import ElementTree as ET 2 3 4 # 创建根节点 5 root = ET.Element("famliy") 6 7 8 # 创建节点大儿子 9 son1 = ET.Element(\'son\', {\'name\': \'儿1\'}) 10 # 创建小儿子 11 son2 = ET.Element(\'son\', {"name": \'儿2\'}) 12 13 # 在大儿子中创建两个孙子 14 grandson1 = ET.Element(\'grandson\', {\'name\': \'儿11\'}) 15 grandson2 = ET.Element(\'grandson\', {\'name\': \'儿12\'}) 16 son1.append(grandson1) 17 son1.append(grandson2) 18 19 20 # 把儿子添加到根节点中 21 root.append(son1) 22 root.append(son1) 23 24 tree = ET.ElementTree(root) 25 tree.write(\'oooo.xml\',encoding=\'utf-8\', short_empty_elements=False) 26 27 创建方式(一) 28 29 创建方式一
由于原生保存的XML时默认无缩进,如果要设置缩进的话,需要修改保存方式:
1 from xml.etree import ElementTree as ET 2 from xml.dom import minidom 3 4 5 def prettify(elem): 6 """将节点转换成字符串,并添加缩进。 7 """ 8 rough_string = ET.tostring(elem, \'utf-8\') 9 reparsed = minidom.parseString(rough_string) 10 return reparsed.toprettyxml(indent="\\t") 11 12 # 创建根节点 13 root = ET.Element("famliy") 14 15 16 # 创建大儿子 17 # son1 = ET.Element(\'son\', {\'name\': \'儿1\'}) 18 son1 = root.makeelement(\'son\', {\'name\': \'儿1\'}) 19 # 创建小儿子 20 # son2 = ET.Element(\'son\', {"name": \'儿2\'}) 21 son2 = root.makeelement(\'son\', {"name": \'儿2\'}) 22 23 # 在大儿子中创建两个孙子 24 # grandson1 = ET.Element(\'grandson\', {\'name\': \'儿11\'}) 25 grandson1 = son1.makeelement(\'grandson\', {\'name\': \'儿11\'}) 26 # grandson2 = ET.Element(\'grandson\', {\'name\': \'儿12\'}) 27 grandson2 = son1.makeelement(\'grandson\', {\'name\': \'儿12\'}) 28 29 son1.append(grandson1) 30 son1.append(grandson2) 31 32 33 # 把儿子添加到根节点中 34 root.append(son1) 35 root.append(son1) 36 37 38 raw_str = prettify(root) 39 40 f = open("xxxoo.xml",\'w\',encoding=\'utf-8\') 41 f.write(raw_str) 42 f.close() 43 44 定义缩进函数
4、命名空间
详细介绍,猛击这里
1 from xml.etree import ElementTree as ET 2 3 ET.register_namespace(\'com\',"http://www.company.com") #some name 4 5 # build a tree structure 6 root = ET.Element("{http://www.company.com}STUFF") 7 body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": "123"}) 8 body.text = "STUFF EVERYWHERE!" 9 10 # wrap it in an ElementTree instance, and save as XML 11 tree = ET.ElementTree(root) 12 13 tree.write("page.xml", 14 xml_declaration=True, 15 encoding=\'utf-8\', 16 method="xml") 17 18 命名空间
三、requests模块
requests是使用Apache2 Licensed许可证的基于python开发的HTTP库,其在python内置模块的基础上进行了高度的封装,从而使pythoner在进行网络请求时,变得更容易,使用requests可以轻而易举的完成浏览器可有的任何操作。requests模块是第三方开发库里的模块,调用前要先下载安装该模块。
1、安装模块
pip3 install requests
2、使用模块
1 无参数,直接访问网站,拿数据 2 import requests 3 response = requests.get("http://www.weather.com.cn/adat/sk/101010500.html") 4 response.encoding=\'utf-8\' 5 result = response.text 6 print(result) 7 ###################执行结果如下:##################### 8 {"weatherinfo": 9 {"city":"怀柔", 10 "cityid":"101010500", 11 "temp":"9", 12 "WD":"南风", 13 "WS":"1级", 14 "SD":"29%", 15 "WSE":"1", 16 "time":"10:25", 17 "isRadar":"1", 18 "Radar":"JC_RADAR_AZ9010_JB", 19 "njd":"暂无实况","qy":"1007"} 20 }
1 有参数,参数用params=变量名传入,结果中会先将参数打印在头部 2 import requests 3 payload={\'k1\':\'value1\',\'k2\':\'value2\'} 4 ret=requests.get("http://www.weather.com.cn/adat/sk/101010500.html",params=payload) 5 ret.encoding=\'utf-8\' 6 print(ret.url) 7 print(ret.text) 8 ###############执行结果如下:################ 9 http://www.weather.com.cn/adat/sk/101010500.html?k1=value1&k2=value2 10 {"weatherinfo": 11 {"city":"怀柔", 12 "cityid":"101010500", 13 "temp":"9", 14 "WD":"南风", 15 "WS":"级", 16 "SD":"29%", 17 "WSE":"1", 18 "time":"10:25", 19 "isRadar":"1", 20 "Radar":"JC_RADAR_AZ9010_JB", 21 "njd":"暂无实况", 22 "qy":"1007"} 23 }
1 # 1、基本POST实例 2 3 import requests 4 5 payload = {\'key1\': \'value1\', \'key2\': \'value2\'} 6 ret = requests.post("http://httpbin.org/post", data=payload) 7 8 print(ret.text) 9 10 11 # 2、发送请求头和数据实例 12 13 import requests 14 import json 15 16 url = \'https://api.github.com/some/endpoint\' 17 payload = {\'some\': \'data\'} 18 headers = {\'content-type\': \'application/json\'} 19 20 ret = requests.post(url, data=json.dumps(payload), headers=headers) 21 22 print(ret.text) 23 print(ret.cookies)#cookies验证,比如登录后服务器会发送一串XX码保存在客户端内存中或硬盘中,即为cookies 24 25 POST请求
更多requests模块相关的文档见:http://cn.python-requests.org/zh_CN/latest/
3、用requests模块发送HTTP请求,请求结束后解析XML的实例
1 import urllib 2 import requests 3 from xml.etree import ElementTree as ET 4 5 # 使用内置模块urllib以上是关于python3----模块(序列化(json&pickle)+XML+requests)的主要内容,如果未能解决你的问题,请参考以下文章
python3----模块(序列化(json&pickle)+XML+requests)
学习廖雪峰Python3教程的python序列化json模块的小笔记