模块(序列化(jsonpickle)+XML+requests)
生活随笔
收集整理的這篇文章主要介紹了
模块(序列化(jsonpickle)+XML+requests)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、序列化模塊
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) #data2、操作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 minidomdef 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 ETET.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": "123"}) 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")命名空間 View Code?三、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":"101010500", "temp":"9", "WD":"南風", "WS":"級", "SD":"29%", "WSE":"1", "time":"10:25", "isRadar":"1", "Radar":"JC_RADAR_AZ9010_JB", "njd":"暫無實況", "qy":"1007"} } # 1、基本POST實例import requestspayload = {'key1': 'value1', 'key2': 'value2'} ret = requests.post("http://httpbin.org/post", data=payload)print(ret.text)# 2、發送請求頭和數據實例import requests import jsonurl = '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碼保存在客戶端內存中或硬盤中,即為cookiesPOST請求
?
?更多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:查看火車??啃畔?/span>?
注:更多接口猛擊這里四、總結
1、json數據傳輸時用的 2、XML一種文件表現形式,形似樹 3、requests模塊就是程序媛們訪問網站或者API接口拿數據時用的,記住requests比urllib好用,然后記住requests.get(),requests.post()就行了轉載于:https://www.cnblogs.com/tina-python/p/5525453.html
總結
以上是生活随笔為你收集整理的模块(序列化(jsonpickle)+XML+requests)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一个Java应用
- 下一篇: 3164 质因数分解