zoukankan      html  css  js  c++  java
  • 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'x80x03}qx00(Xx02x00x00x00k2qx01Xx05x00x00x00helloqx02Xx02x00x00x00k1qx03K{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跨平台跨语言的数据传输格式

    XML实现不同语言或程序之间进行数据交换的协议
    返回的都是字符串,只是不同表现形式的字符串
    XML文件格式如下:
     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)修改节点内容

    由于修改节点时,都是在内存中进行,不会影响文件中的内容,所以,如果想要修改,则需要重新将内存中的内容写入到文件。
    解析字符串方式打开,修改,保存
    解析文件方式打开,修改,保存
    (4)删除节点
    解析字符串方式打开,删除,保存
    解析文件方式打开,删除,保存

    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="	")
    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发送HTTP请求,或者XML格式内容
     6 """
     7 f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
     8 result = f.read().decode('utf-8')
     9 """
    10 @@显然使用内置urllib模块的方式比较繁琐,所以请选择忘记,并选择用下面的requests模块来发送HTTP请求。@@
    11 
    12 # 使用第三方模块requests发送HTTP请求,或者XML格式内容
    13 r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
    14 result = r.text
    15 
    16 # 解析XML格式内容
    17 node = ET.XML(result)#这里的ET.XML在此篇二、XML模块中有详解
    18 
    19 # 获取内容
    20 if node.text == "Y":
    21     print("在线")
    22 else:
    23     print("离线")
    24 
    25 eg1:检测QQ账号是否在线
     1 import urllib
     2 import requests
     3 from xml.etree import ElementTree as ET
     4 
     5 # 使用内置模块urllib发送HTTP请求,或者XML格式内容
     6 """
     7 f = urllib.request.urlopen('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
     8 result = f.read().decode('utf-8')
     9 """
    10 
    11 # 使用第三方模块requests发送HTTP请求,或者XML格式内容
    12 r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
    13 result = r.text
    14 
    15 # 解析XML格式内容
    16 root = ET.XML(result)
    17 for node in root.iter('TrainDetailInfo'):
    18     print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib)
    19 
    20 eg2:查看火车停靠信息

    注:更多接口猛击这里

    四、总结

    1、json数据传输时用的

    2、XML一种文件表现形式,形似树
    3、requests模块就是程序媛们访问网站或者API接口拿数据时用的,记住requests比urllib好用,然后记住requests.get(),requests.post()就行了
  • 相关阅读:
    Python pip 下载速度慢? Windows 设置 国内源,用阿里云国内镜像加速
    Go timer 是如何被调度的?
    Go sync.Pool 浅析
    一次错误使用 go-cache 导致出现的线上问题
    golang面向对象分析
    一文完全掌握 Go math/rand
    这一次,彻底搞懂 Go Cond
    面试题:让你捉摸不透的 Go reslice
    当 Go struct 遇上 Mutex
    这可能是最容易理解的 Go Mutex 源码剖析
  • 原文地址:https://www.cnblogs.com/jonm/p/8304656.html
Copyright © 2011-2022 走看看