pythonjam怎么运行_第二十一天 PYTHON学习
【今日學(xué)習(xí)】
一、什么是序列化?
我們把對(duì)象(變量)從內(nèi)存中變成可存儲(chǔ)或傳輸?shù)倪^(guò)程稱之為序列化,在Python中叫pickling,在其他語(yǔ)言中也被稱之為serialization,marshalling,flattening等等,都是一個(gè)意思。
二、為什么要序列化?
1:持久保存狀態(tài)【硬盤存】
需知一個(gè)軟件/程序的執(zhí)行就在處理一系列狀態(tài)的變化,在編程語(yǔ)言中,'狀態(tài)'會(huì)以各種各樣有結(jié)構(gòu)的數(shù)據(jù)類型(也可簡(jiǎn)單的理解為變量)的形式被保存在內(nèi)存中。
內(nèi)存是無(wú)法永久保存數(shù)據(jù)的,當(dāng)程序運(yùn)行了一段時(shí)間,我們斷電或者重啟程序,內(nèi)存中關(guān)于這個(gè)程序的之前一段時(shí)間的數(shù)據(jù)(有結(jié)構(gòu))都被清空了。
在斷電或重啟程序之前將程序當(dāng)前內(nèi)存中所有的數(shù)據(jù)都保存下來(lái)(保存到文件中),以便于下次程序執(zhí)行能夠從文件中載入之前的數(shù)據(jù),然后繼續(xù)執(zhí)行,這就是序列化。
具體的來(lái)說(shuō),你玩使命召喚闖到了第13關(guān),你保存游戲狀態(tài),關(guān)機(jī)走人,下次再玩,還能從上次的位置開(kāi)始繼續(xù)闖關(guān)。或如,虛擬機(jī)狀態(tài)的掛起等。
2:跨平臺(tái)數(shù)據(jù)交互【網(wǎng)絡(luò)傳】
序列化之后,不僅可以把序列化后的內(nèi)容寫入磁盤,還可以通過(guò)網(wǎng)絡(luò)傳輸?shù)絼e的機(jī)器上,如果收發(fā)的雙方約定好實(shí)用一種序列化的格式,那么便打破了平臺(tái)/語(yǔ)言差異化帶來(lái)的限制,實(shí)現(xiàn)了跨平臺(tái)數(shù)據(jù)交互。
反過(guò)來(lái),把變量?jī)?nèi)容從序列化的對(duì)象重新讀到內(nèi)存里稱之為反序列化,即unpickling。
json模塊【轉(zhuǎn)化成str類型】(優(yōu)先掌握)
序列化與反序列化一:
json.dumps ? json.loads ?是一對(duì)
序列化:
dic={'name':'egon','age':18}
with open('db.json','w',encoding='utf-8') as f:
res = json.dumps(dic)
f.write(res)
print(res,type(res))
結(jié)果
{"name": "egon", "age": 18}
#json格式全都是雙引號(hào),如果不是雙引號(hào),反序列化json就識(shí)別不了
#一個(gè)數(shù)據(jù)結(jié)構(gòu)dump一次就行了,不要用‘a(chǎn).txt ’去添加
反序列化:
with open('db.json','r',encoding='utf-8') as f:
data=f.read()
res=json.loads(data)
print(res)
結(jié)果
{'name': 'egon', 'age': 18}
序列化與反序列化二:
簡(jiǎn)化版
json.dump ? json.load ?是一對(duì)
序列化
import json
dic = {'name': 'egon', 'age': 18}
with open('db1.json','w',encoding='utf-8') as f:
json.dump(dic,f)
反序列化
import json
dic = {'name': 'egon', 'age': 18}
with open('db1.json','r',encoding='utf-8') as f:
print(json.load(f))
優(yōu)點(diǎn):數(shù)據(jù)跨平臺(tái)較好
缺點(diǎn):有些python數(shù)據(jù)類型不能識(shí)別,只能識(shí)別以下圖片上數(shù)據(jù)類型
沒(méi)有元組和集合
pickle模塊(了解)【轉(zhuǎn)化成bytes類型】
把所有的數(shù)據(jù)類型存成bytes類型,讀也需要用bytes類型去讀
優(yōu)點(diǎn):能識(shí)別所有python數(shù)據(jù)類型,能把所有數(shù)據(jù)類型序列化,用法與json類似
缺點(diǎn):也是最致命缺點(diǎn),只能識(shí)別python,跨平臺(tái)較差
# 用戶注冊(cè)后得到的數(shù)據(jù)
name = "高跟"
password = "123"
height = 1.5
hobby = ["吃","喝","賭","飄",{1,2,3}]
# with open("userdb.txt","wt",encoding="utf-8") as f:
# text = "|".join([name,password,str(height)])
# f.write(text)
# pickle支持python中所有的數(shù)據(jù)類型
user = {"name":name,"password":password,"height":height,"hobby":hobby,"test":3}
# 序列化的過(guò)程
# with open("userdb.pkl","ab") as f:
# userbytes = pickle.dumps(user)
# f.write(userbytes)
# 反序列化過(guò)程
# with open("userdb.pkl","rb") as f:
# userbytes = f.read()
# user = pickle.loads(userbytes)
# print(user)
# print(type(user))
#
#dump 直接序列化到文件
# with open("userdb.pkl","ab") as f:
# pickle.dump(user,f)
# #load 從文件反序列化
with open("userdb.pkl","rb") as f:
user = pickle.load(f)
print(user)
shelve模塊(了解)也能像pickle序列化所有python數(shù)據(jù)類型,比pickle更方便
info1={'name':'egon','age':18}
info2={'name':'run','age':19}
import shelve
d=shelve.open('db.shv')
d['egon']=info1
d['run']=info2
d.close()
import shelve
d=shelve.open('db.shv')
# d['egon']
# d['run']
print(d['egon'])
print(d['run'])
import shelve
d=shelve.open('db.shv',writeback=True)
d['egon']['age']=20
d['run']['age']=18
print(d['egon'])
print(d['run'])
xml模塊(了解)
古老的用法
也是將內(nèi)存中數(shù)據(jù)儲(chǔ)存起來(lái)或傳輸出去,將數(shù)據(jù)組織起來(lái)
# 查
# 三種查找節(jié)點(diǎn)的方式
# 第一種
# import xml.etree.ElementTree as ET
# tree=ET.parse('a.xml')
# root=tree.getroot()
# res=root.iter('year')
# # 會(huì)在整個(gè)樹(shù)中查找,而且是查找所有
# print(res)
# for item in res:
# print('*********************')
# print(item.tag)
# print(item.attrib)
# print(item.text)
# 第二種:
# res=root.find('country')
# # 只能在當(dāng)前元素下一級(jí)查找,并且找到一個(gè)就結(jié)束
# print(item.tag)
# print(item.attrib)
# print(item.text)
# 第三種
# cy=root.findall('country')只能在當(dāng)前元素下一級(jí)查找
# # print(cy)
# for item in cy:
# print(item.tag)
# print(item.attrib)
# print(item.text)
# 改:
# import xml.etree.ElementTree as ET
# tree=ET.parse('a.xml')
# root=tree.getroot()
# for year in root.iter('year'):
# year.text=str(int(year.text)+10)
# year.attrib={'update':'year'}
# tree.write('a.xml')
# # 增
# import xml.etree.ElementTree as ET
# tree=ET.parse('a.xml')
# root=tree.getroot()
# for country in root.iter('country'):
# year=country.find('year')
# if int(year.text)> 2020:
# print(country.attrib)
# ele=ET.Element('run')
# ele.attrib={'nb':'shuai'}
# ele.text='ok'
# country.append(ele)
# tree.write('a.xml')
# 刪
# import xml.etree.ElementTree as ET
# tree=ET.parse('a.xml')
# root=tree.getroot()
# for country in root.iter('country'):
# year=country.find('year')
# if int(year.text)> 2020:
# # print(country.attrib)
# country.remove(year)
# tree.write('a.xml')
configparser模塊import configparser
# 取值
# import configparser
# config=configparser.ConfigParser()
# config.read('my.ini')
# secs=config.sections()
# print(secs)
# print(config.options('run'))
#
# print(config.get('run','age'))
# print(config.getboolean('run','is_husband'))
# print(config.getfloat('run','salary'))
【今日領(lǐng)悟】
1.json是最常用的序列化與反序列化模塊,其它類型的模塊常用部分熟悉就行
2.需要在實(shí)際按例中去應(yīng)用才能體會(huì)這幾個(gè)模塊的不同
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的pythonjam怎么运行_第二十一天 PYTHON学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 服务器可以ghost备份吗_Ghost超
- 下一篇: linux不保存退出命令_面试提问说出1