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()就行了
  • 相关阅读:
    149. Max Points on a Line(js)
    148. Sort List(js)
    147. Insertion Sort List(js)
    146. LRU Cache(js)
    145. Binary Tree Postorder Traversal(js)
    144. Binary Tree Preorder Traversal(js)
    143. Reorder List(js)
    142. Linked List Cycle II(js)
    141. Linked List Cycle(js)
    140. Word Break II(js)
  • 原文地址:https://www.cnblogs.com/jonm/p/8304656.html
Copyright © 2011-2022 走看看