一、序列化模組

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': '', 'name': 'tina'} <class 'dict'>
#json.dumps()將python的基本資料型別轉換成字串
a={"name":"tina","age":""}
b=json.dumps(a)
print(b,type(b))
#############執行結果如下:##########
{"age": "", "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文件的所有內容

eg1

(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)

eg1

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

eg2

 (3)修改節點內容
由於修改節點時,都是在記憶體中進行,不會影響檔案中的內容,所以,如果想要修改,則需要重新將記憶體中的內容寫入到檔案。
解析字串方式開啟,修改,儲存
解析檔案方式開啟,修改,儲存
(4)刪除節點
解析字串方式開啟,刪除,儲存
解析檔案方式開啟,刪除,儲存

3、建立XML文件

from xml.etree import ElementTree as ET

# 建立根節點
root = ET.Element("famliy") # 建立節點大兒子
son1 = ET.Element('son', {'name': '兒1'})
# 建立小兒子
son2 = ET.Element('son', {"name": '兒2'}) # 在大兒子中建立兩個孫子
grandson1 = ET.Element('grandson', {'name': '兒11'})
grandson2 = ET.Element('grandson', {'name': '兒12'})
son1.append(grandson1)
son1.append(grandson2) # 把兒子新增到根節點中
root.append(son1)
root.append(son1) tree = ET.ElementTree(root)
tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) 建立方式(一)

建立方式一

建立方式二
建立方式三
 由於原生儲存的XML時預設無縮排,如果要設定縮排的話,需要修改儲存方式:
from xml.etree import ElementTree as ET
from xml.dom import minidom def prettify(elem):
"""將節點轉換成字串,並新增縮排。
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent="\t") # 建立根節點
root = ET.Element("famliy") # 建立大兒子
# son1 = ET.Element('son', {'name': '兒1'})
son1 = root.makeelement('son', {'name': '兒1'})
# 建立小兒子
# son2 = ET.Element('son', {"name": '兒2'})
son2 = root.makeelement('son', {"name": '兒2'}) # 在大兒子中建立兩個孫子
# grandson1 = ET.Element('grandson', {'name': '兒11'})
grandson1 = son1.makeelement('grandson', {'name': '兒11'})
# grandson2 = ET.Element('grandson', {'name': '兒12'})
grandson2 = son1.makeelement('grandson', {'name': '兒12'}) son1.append(grandson1)
son1.append(grandson2) # 把兒子新增到根節點中
root.append(son1)
root.append(son1) raw_str = prettify(root) f = open("xxxoo.xml",'w',encoding='utf-8')
f.write(raw_str)
f.close()

定義縮排函式

4、名稱空間

詳細介紹,猛擊這裡

from xml.etree import ElementTree as ET

ET.register_namespace('com',"http://www.company.com") #some name

# build a tree structure
root = ET.Element("{http://www.company.com}STUFF")
body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF", attrib={"{http://www.company.com}hhh": ""})
body.text = "STUFF EVERYWHERE!" # wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root) tree.write("page.xml",
xml_declaration=True,
encoding='utf-8',
method="xml") 名稱空間

三、requests模組

requests是使用Apache2 Licensed許可證的基於python開發的HTTP庫,其在python內建模組的基礎上進行了高度的封裝,從而使pythoner在進行網路請求時,變得更容易,使用requests可以輕而易舉的完成瀏覽器可有的任何操作。requests模組是第三方開發庫裡的模組,呼叫前要先下載安裝該模組。

1、安裝模組

pip3 install requests

2、使用模組

無引數,直接訪問網站,拿資料
import requests
response = requests.get("http://www.weather.com.cn/adat/sk/101010500.html")
response.encoding='utf-8'
result = response.text
print(result)
###################執行結果如下:#####################
{"weatherinfo":
{"city":"懷柔",
"cityid":"101010500",
"temp":"9",
"WD":"南風",
"WS":"1級",
"SD":"29%",
"WSE":"1",
"time":"10:25",
"isRadar":"1",
"Radar":"JC_RADAR_AZ9010_JB",
"njd":"暫無實況","qy":"1007"}
}
有引數,引數用params=變數名傳入,結果中會先將引數列印在頭部
import requests
payload={'k1':'value1','k2':'value2'}
ret=requests.get("http://www.weather.com.cn/adat/sk/101010500.html",params=payload)
ret.encoding='utf-8'
print(ret.url)
print(ret.text)
###############執行結果如下:################
http://www.weather.com.cn/adat/sk/101010500.html?k1=value1&k2=value2
{"weatherinfo":
{"city":"懷柔",
"cityid":"",
"temp":"",
"WD":"南風",
"WS":"級",
"SD":"29%",
"WSE":"",
"time":"10:25",
"isRadar":"",
"Radar":"JC_RADAR_AZ9010_JB",
"njd":"暫無實況",
"qy":""}
}
# 1、基本POST例項

import requests

payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post("http://httpbin.org/post", data=payload) print(ret.text) # 2、傳送請求頭和資料例項 import requests
import json url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'} ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text)
print(ret.cookies)#cookies驗證,比如登入後伺服器會發送一串XX碼儲存在客戶端記憶體中或硬碟中,即為cookies POST請求

更多requests模組相關的文件見:http://cn.python-requests.org/zh_CN/latest/

 3、用requests模組傳送HTTP請求,請求結束後解析XML的例項
import urllib
import requests
from xml.etree import ElementTree as ET # 使用內建模組urllib傳送HTTP請求,或者XML格式內容
"""
f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
result = f.read().decode('utf-8')
"""
@@顯然使用內建urllib模組的方式比較繁瑣,所以請選擇忘記,並選擇用下面的requests模組來發送HTTP請求。@@ # 使用第三方模組requests傳送HTTP請求,或者XML格式內容
r = requests.get('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')
result = r.text # 解析XML格式內容
node = ET.XML(result)#這裡的ET.XML在此篇二、XML模組中有詳解 # 獲取內容
if node.text == "Y":
print("線上")
else:
print("離線")

eg1:檢測QQ賬號是否線上

import urllib
import requests
from xml.etree import ElementTree as ET # 使用內建模組urllib傳送HTTP請求,或者XML格式內容
"""
f = urllib.request.urlopen('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
result = f.read().decode('utf-8')
""" # 使用第三方模組requests傳送HTTP請求,或者XML格式內容
r = requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=G666&UserID=')
result = r.text # 解析XML格式內容
root = ET.XML(result)
for node in root.iter('TrainDetailInfo'):
print(node.find('TrainStation').text,node.find('StartTime').text,node.tag,node.attrib)

eg2:檢視火車停靠資訊

 注:更多介面猛擊這裡

四、總結

1、json資料傳輸時用的
2、XML一種檔案表現形式,形似樹
3、requests模組就是程式媛們訪問網站或者API介面拿資料時用的,記住requests比urllib好用,然後記住requests.get(),requests.post()就行了