python模块--json \ pickle \ shelve \ XML模块
一、json模塊
之前學(xué)習(xí)過(guò)的eval內(nèi)置方法可以將一個(gè)字符串轉(zhuǎn)成一個(gè)python對(duì)象,不過(guò)eval方法時(shí)有局限性的,對(duì)于普通的數(shù)據(jù)類(lèi)型,json.loads和eval都能用,但遇到特殊類(lèi)型的時(shí)候,eval就不管用了。所以eval的重點(diǎn)還是通常用來(lái)執(zhí)行一個(gè)字符串表達(dá)式,并返回表達(dá)式的值。
1 import json 2 x = "[null,true,false,1]" 3 # print(eval(x)) #用eval會(huì)報(bào)錯(cuò) 4 print(json.loads(x)) # 用json就不會(huì)報(bào)錯(cuò) View Code什么是序列化?
我們把對(duì)象(變量)從內(nèi)存種變成可存儲(chǔ)或傳輸?shù)倪^(guò)程稱(chēng)之為序列化,在python種叫picking,在其他語(yǔ)言種也被稱(chēng)之為serialiation,marshalling,flattening,等等,都是一個(gè)意思。序列化之后,就可以把徐磊話(huà)后的內(nèi)容寫(xiě)入磁盤(pán),或者通過(guò)網(wǎng)絡(luò)傳輸?shù)綑C(jī)器上。反過(guò)來(lái),把變量?jī)?nèi)容從徐磊話(huà)的對(duì)象重新督導(dǎo)內(nèi)存里稱(chēng)之為反序列化,即unpicking.
json
如果我們要在不同的編程語(yǔ)言之間傳遞對(duì)象,就必須把對(duì)象序列化為標(biāo)準(zhǔn)式,比如XML,但更好的方法是序列化為json,因?yàn)閖son表示出來(lái)就是一個(gè)字符串,可以被所有語(yǔ)言讀取。也可以方便的存儲(chǔ)到磁盤(pán)或者通過(guò)網(wǎng)絡(luò)傳輸。json不僅是標(biāo)準(zhǔn)式,并且比XML更快,而且可以直接在web頁(yè)面種讀取,非常方便。
1 json表示的對(duì)象就是標(biāo)準(zhǔn)的JavaScript語(yǔ)言的對(duì)象,json和python內(nèi)置的書(shū)v類(lèi)型如下: 2 3 JSON PYTHON類(lèi)型 4 {} dict 5 [] list 6 "string" str 7 1234.56 int或float 8 true/false Ture/False 9 null Nonejson的內(nèi)部轉(zhuǎn)成
1 dic={'name':'alex'}#---->{"name":"alex"}----->'{"name":"alex"}' 2 i=8 #---->'8' 3 s='hello' #---->"hello"------>'"hello"' 4 l=[11,22] #---->"[11,22]"?
例1:json和eval的區(qū)別
1 import json 2 x = "[null,true,false,1]" 3 # print(eval(x)) #用eval會(huì)報(bào)錯(cuò) 4 print(json.loads(x)) # 用json就不會(huì)報(bào)錯(cuò),即eval有局限性例2:不用json時(shí)的讀寫(xiě)文件方式
1 dic = '{"name":"老王","age":18}' 2 f = open("hello","w",encoding="utf-8") 3 f.write(dic) 4 f.close() # 注意,寫(xiě)完文件后要記得關(guān)閉文件 5 f_read = open("hello","r",encoding="utf-8") 6 data = f_read.read() 7 # print(data) 8 print(type(data)) 9 dat = eval(data) 10 print(dat) 11 print(dat["name"])例3:運(yùn)用json時(shí)的讀寫(xiě)方式
1 import json 2 dic = {'name':'老王','age':19} 3 f = open("new_hello","w",encoding="utf-8") 4 dic_str = json.dumps(dic) #將字典編譯成json格式的字符串,因?yàn)閖son格式的可以進(jìn)行多種數(shù)據(jù)傳輸。即序列化的過(guò)程 5 f.write(dic_str) #寫(xiě)入文件,最后存在文件中的形式都是字符串格式的,已經(jīng)不是字典了。 6 f.close() 7 #json.dump(dic,f) #該句相當(dāng)于以上兩句的效果,平時(shí)用上面的比較好。 8 9 f_read = open("new_hello","r",encoding="utf-8") 10 data = json.loads(f_read.read()) #進(jìn)行反序列化,將json格式的字符串轉(zhuǎn)成普通的字符串 11 #data = json.load(f_read) #該句相當(dāng)于以上一句。可以簡(jiǎn)單化,但是平時(shí)用上面的比較多。 12 print(data) 13 print(type(data)) #由此可見(jiàn),反序列化后,又轉(zhuǎn)成了字典形式。 14 print(data["name"]) #由上一部可以得知,這里可以進(jìn)行由鍵取值 1 {'name': '老王', 'age': 19} 2 <class 'dict'> 3 老王例4:注意一些細(xì)節(jié)
1 import json 2 with open("new_hello1","r") as f: #這種讀取方式可以命名,如別名 "f",也要有打開(kāi)方式 3 data = f.read() 4 data = json.loads(data) 5 print(data["name"])二,pickle模塊
pickle
pickle的問(wèn)題和所有其他編程語(yǔ)言特有的序列化問(wèn)題一樣,就是它只能用于python,并且可能不同版本的python彼此都不兼容,因此,只能用pickle保存那些不重要的數(shù)據(jù),不能成功地反序列化也沒(méi)關(guān)系。
例:pickle的序列化與反序列化的過(guò)程
1 dic = {"name":"老王","age":18,"gender":"male"} 2 import pickle 3 print(type(dic)) #<class 'dict'> 4 5 j = pickle.dumps(dic) 6 print(type(j)) #<class 'bytes'> 7 8 f = open("序列化_str","wb") #"w"是寫(xiě)入str; "wb"是寫(xiě)入bytes.注意這個(gè)細(xì)節(jié) 9 f.write(j) 10 f.close() 11 #j = picklr.dumps(dic) 和f.write(j) 這兩句等價(jià)于 pickle.dump(f) 12 ####-----> 以上pickle.dumps() 的過(guò)程就相當(dāng)于 【序列化】 的過(guò)程 13 14 ####-----> 以下pickle.loads() 就是反序列化的過(guò)程 15 f_read = open("序列化_str","rb") 16 data = pickle.loads(f_read.read()) #相當(dāng)于 data = pickle.load(f.read) 17 print(data["name"]) 18 print(data["age"]) 1 <class 'dict'> 2 <class 'bytes'> 3 老王 4 18三,shelve模塊
shelve
shelve模塊比pickle模塊簡(jiǎn)單,只有一個(gè)open函數(shù),返回類(lèi)似字典的對(duì)象,可讀可寫(xiě);key必須為字符串,而值可以是python所支持的數(shù)據(jù)類(lèi)。
四、XML
XML模塊
xml是實(shí)現(xiàn)不同語(yǔ)言或程序之間進(jìn)行數(shù)據(jù)交換的協(xié)議,跟json差不多,但json使用起來(lái)更簡(jiǎn)單,不過(guò),古時(shí)候,在json還沒(méi)有誕生的的年代里,大家只能選擇用xml,至今很多傳統(tǒng)公司如金融行業(yè)的很多系統(tǒng)的接口還主要是xml.
xml的格式如下,就是通過(guò)<>節(jié)點(diǎn)來(lái)區(qū)別數(shù)據(jù)結(jié)構(gòu)的:
數(shù)據(jù)代碼如下
1 <data> 2 <country name="Liechtenstein"> 3 <rank updated="yes">2</rank> 4 <year updated="yes">2010</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 updated="yes">2013</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 updated="yes">2013</year> 18 <gdppc>13600</gdppc> 19 <neighbor direction="W" name="Costa Rica" /> 20 <neighbor direction="E" name="Colombia" /> 21 </country> 22 </data> View Code注釋:屬性用來(lái)解釋標(biāo)簽;屬性加在標(biāo)簽的第一個(gè)<>里面;xml都是tag屬性。
xml協(xié)議在各個(gè)語(yǔ)言里都是支持的,在python中可以用以下模塊操作xml:
1 #####--------------------------> XML 2 import xml.etree.ElementTree as ET # 原名太長(zhǎng),可以起別名,方便下面引用 3 4 tree = ET.parse('xml_lesson1') #?? 5 root = tree.getroot() #?? 6 print(root.tag) #打印根節(jié)點(diǎn) 7 8 for i in root: 9 # print(i.tag) #打印data下的第一層節(jié)點(diǎn),即三個(gè)country 10 # print(i.attrib) # 打印每個(gè)節(jié)點(diǎn)的屬性,即country,<>內(nèi)部緊跟country的部分 11 for j in i: 12 # print(j.tag) #打印data下的第二層節(jié)點(diǎn),即country下的節(jié)點(diǎn), 13 # print(j.attrib) # 打印該層每個(gè)節(jié)點(diǎn)的屬性 14 print(j.text) #打印 每?jī)蓚€(gè)<>之間包括的值 15 16 ##-------> 遍歷xml文檔 17 18 for child in root: 19 print(child.tag,child.attrib) 20 for n in child: 21 print(n.tag,n.text) 22 23 ##------> 只遍歷year節(jié)點(diǎn) 24 for code in root.iter('year'): 25 print(code.tag,code.text) 26 27 28 ###-------------> 修改 29 import xml.etree.ElementTree as ET # 原名太長(zhǎng),可以起別名,方便下面引用 30 31 tree = ET.parse('xml_lesson1') 32 root = tree.getroot() 33 34 ###-------------> 修改 35 for code in root.iter('year'): 36 new_year = int(code.text) + 1 37 code.text = str(new_year) 38 code.set("updated","yes") 39 tree.write('xml_lesson') 40 41 ##--------------> 刪除節(jié)點(diǎn) 42 for node in root.findall('country'): 43 rank = int(node.find('rank').text) 44 if rank > 5: 45 root.remove(node) 46 tree.write('output.xml') View Code?
1 import xml.etree.ElementTree as ET # 原名太長(zhǎng),可以起別名,方便下面引用 2 3 tree = ET.parse('xml_lesson1') #解析xml,讀取數(shù)據(jù),攝取數(shù)據(jù)賦給變量tree,tree即成對(duì)象, 4 # 且是一個(gè)實(shí)體對(duì)象,可以調(diào)用一系類(lèi)方法 5 #'xml_lesson1 里面存的都是文檔樹(shù) 6 #data是根對(duì)象,下面的country都是節(jié)點(diǎn)對(duì)象 7 root = tree.getroot() #獲取tree的根節(jié)點(diǎn) 8 print(root.tag) #打印根節(jié)點(diǎn)?
?
?
自己創(chuàng)建xml文檔
1 ####--------------------------> 自己創(chuàng)建標(biāo)簽語(yǔ)言 2 import xml.etree.ElementTree as ET 3 new_xml = ET.Element('namelist') 4 name = ET.SubElement(new_xml,'name',attrib={'enrolled':'yes'}) 5 age = ET.SubElement(name,'age',attrib={'checked':'no'}) 6 sex = ET.SubElement(name, "sex") 7 sex.text = '33' 8 name2 = ET.SubElement(new_xml, 'name', attrib={"enrolled": "no"}) 9 age = ET.SubElement(name2, 'age') 10 age.text = '19' 11 12 et = ET.ElementTree('newx_xml') #生成文檔對(duì)象 13 et.write('test.xml',encoding='utf-8',xml_declaration=True) 14 #ET.dump(new_xml) # 打印生成的格式 View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/jianguo221/p/9006879.html
總結(jié)
以上是生活随笔為你收集整理的python模块--json \ pickle \ shelve \ XML模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 判断url是否包含协议并添加协议(判断u
- 下一篇: Python判断两个域名的主域名是否相同