Python 入門(mén)之 內(nèi)置模塊 -- 序列化模塊(json模塊、pickle模塊)
1、序列化
Python中這種序列化模塊有三種:
? json模塊 :
? 不同語(yǔ)言都遵循的一種數(shù)據(jù)轉(zhuǎn)化格式,即不同語(yǔ)言都使用的特殊字符串。(比如Python的一個(gè)列表[1, 2, 3]利用json轉(zhuǎn)化成特殊的字符串,然后在編碼成bytes發(fā)送給php的開(kāi)發(fā)者,php的開(kāi)發(fā)者就可以解碼成特殊的字符串,然后在反解成原數(shù)組(列表): [1, 2, 3])
? json序列化只支持部分Python數(shù)據(jù)結(jié)構(gòu):dict,list, tuple,str,int, float,True,False,None
? pickle模塊:
? 只能是Python語(yǔ)言遵循的一種數(shù)據(jù)轉(zhuǎn)化格式,只能在python語(yǔ)言中使用。
? 支持Python所有的數(shù)據(jù)類(lèi)型包括實(shí)例化對(duì)象。
? shelve模塊:類(lèi)似于字典的操作方式去操作特殊的字符串。
序列化的本質(zhì)就是將一種數(shù)據(jù)結(jié)構(gòu)(如字典,列表)等轉(zhuǎn)換成一個(gè)特殊的序列(字符串或者bytes)的過(guò)程就叫做序列化。
(1)序列化模塊就是將一個(gè)常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化成一個(gè)特殊的序列,并且這個(gè)特殊的序列還可以反解回去。
(2)主要用途:
<1> 文件讀寫(xiě)數(shù)據(jù)
<2> 網(wǎng)絡(luò)傳輸數(shù)據(jù)
(3)json模塊
<1> json模塊是將滿(mǎn)足條件的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化成特殊的字符串,并且也可以反序列化還原回去
<2> 能夠序列的數(shù)據(jù)類(lèi)型:字典,列表,元組
? 4方法 2組
dumps loads ---- 用于網(wǎng)絡(luò)傳輸
dump load ---- 用于文件存儲(chǔ)
1> dumps、loads
[1] 將字典類(lèi)型轉(zhuǎn)換成字符串類(lèi)型
import json
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = json.dumps(dic) #序列化:將一個(gè)字典轉(zhuǎn)換成一個(gè)字符串
print(type(str_dic),str_dic) #
{"k3": "v3", "k1": "v1", "k2": "v2"}
#注意,json轉(zhuǎn)換完的字符串類(lèi)型的字典中的字符串是由""表示的
[2] 將字符串類(lèi)型的字典轉(zhuǎn)換成字典類(lèi)型
import json
dic2 = json.loads(str_dic) #反序列化:將一個(gè)字符串格式的字典轉(zhuǎn)換成一個(gè)字典
#注意,要用json的loads功能處理的字符串類(lèi)型的字典中的字符串必須由""表示
print(type(dic2),dic2) #
{'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
[3] 還支持列表類(lèi)型
list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
str_dic = json.dumps(list_dic) #也可以處理嵌套的數(shù)據(jù)類(lèi)型
print(type(str_dic),str_dic) #
[1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
list_dic2 = json.loads(str_dic)
print(type(list_dic2),list_dic2) #
[1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
2> dump、load
[1] 將對(duì)象轉(zhuǎn)換成字符串寫(xiě)入到文件當(dāng)中
import json
f = open('json_file.json','w')
dic = {'k1':'v1','k2':'v2','k3':'v3'}
json.dump(dic,f) #dump方法接收一個(gè)文件句柄,直接將字典轉(zhuǎn)換成json字符串寫(xiě)入文件
f.close()
# json文件也是文件,就是專(zhuān)門(mén)存儲(chǔ)json字符串的文件。
[2] 將文件中的字符串類(lèi)型的字典轉(zhuǎn)換成字典
import json
f = open('json_file.json')
dic2 = json.load(f) #load方法接收一個(gè)文件句柄,直接將文件中的json字符串轉(zhuǎn)換成數(shù)據(jù)結(jié)構(gòu)返回
f.close()
print(type(dic2),dic2)
其他參數(shù)說(shuō)明
ensure_ascii
:,當(dāng)它為T(mén)rue的時(shí)候,所有非ASCII碼字符顯示為\uXXXX序列,只需在dump時(shí)將ensure_ascii設(shè)置為False即可,此時(shí)存入json的中文即可正常顯示。
separators
:分隔符,實(shí)際上是(item_separator, dict_separator)的一個(gè)元組,默認(rèn)的就是(,,:);這表示dictionary內(nèi)keys之間用“,”隔開(kāi),而KEY和value之間用“:”隔開(kāi)。
sort_keys
:將數(shù)據(jù)根據(jù)keys的值進(jìn)行排序。
json序列化存儲(chǔ)多個(gè)數(shù)據(jù)到同一個(gè)文件中
對(duì)于json序列化,存儲(chǔ)多個(gè)數(shù)據(jù)到一個(gè)文件中是有問(wèn)題的,默認(rèn)一個(gè)json文件只能存儲(chǔ)一個(gè)json數(shù)據(jù),但是也可以解決,舉例說(shuō)明:
對(duì)于json 存儲(chǔ)多個(gè)數(shù)據(jù)到文件中
dic1 = {'name':'oldboy1'}
dic2 = {'name':'oldboy2'}
dic3 = {'name':'oldboy3'}
f = open('序列化',encoding='utf-8',mode='a')
json.dump(dic1,f)
json.dump(dic2,f)
json.dump(dic3,f)
f.close()
f = open('序列化',encoding='utf-8')
ret = json.load(f)
ret1 = json.load(f)
ret2 = json.load(f)
print(ret)
上邊的代碼會(huì)報(bào)錯(cuò),解決方法:
dic1 = {'name':'oldboy1'}
dic2 = {'name':'oldboy2'}
dic3 = {'name':'oldboy3'}
f = open('序列化',encoding='utf-8',mode='a')
str1 = json.dumps(dic1)
f.write(str1+'\n')
str2 = json.dumps(dic2)
f.write(str2+'\n')
str3 = json.dumps(dic3)
f.write(str3+'\n')
f.close()
f = open('序列化',encoding='utf-8')
for line in f:
print(json.loads(line))
(4)pickle模塊
<1> pickle模塊是將Python所有的數(shù)據(jù)結(jié)構(gòu)以及對(duì)象等轉(zhuǎn)化成bytes類(lèi)型,然后還可以反序列化還原回去
<2> 只有Python有,幾乎可以序列Python中所有數(shù)據(jù)類(lèi)型,匿名函數(shù)不能序列
使用上與json幾乎差不多,也是兩對(duì)四個(gè)方法。
dumps loads ---- 用于網(wǎng)絡(luò)傳輸
dump load ---- 用于文件存儲(chǔ)
1> dumps、loads
import pickle
dic = {'k1':'v1','k2':'v2','k3':'v3'}
str_dic = pickle.dumps(dic)
print(str_dic) # bytes類(lèi)型
dic2 = pickle.loads(str_dic)
print(dic2) #字典
# 還可以序列化對(duì)象
import pickle
def func():
print(666)
ret = pickle.dumps(func)
print(ret,type(ret)) # b'\x80\x03c__main__\nfunc\nq\x00.'
f1 = pickle.loads(ret) # f1得到 func函數(shù)的內(nèi)存地址
f1() # 執(zhí)行func函數(shù)
2> dump、load
dic = {(1,2):'oldboy',1:True,'set':{1,2,3}}
f = open('pick序列化',mode='wb')
pickle.dump(dic,f)
f.close()
with open('pick序列化',mode='wb') as f1:
pickle.dump(dic,f1)
pickle序列化存儲(chǔ)多個(gè)數(shù)據(jù)到一個(gè)文件中
dic1 = {'name':'oldboy1'}
dic2 = {'name':'oldboy2'}
dic3 = {'name':'oldboy3'}
f = open('pick多數(shù)據(jù)',mode='wb')
pickle.dump(dic1,f)
pickle.dump(dic2,f)
pickle.dump(dic3,f)
f.close()
f = open('pick多數(shù)據(jù)',mode='rb')
while True:
try:
print(pickle.load(f))
except EOFError:
break
f.close()
自寫(xiě)一個(gè)pickle寫(xiě)入文件上下文
class MyPickle:
def __init__(self,path,mode='load'):
self.path = path
self.mode = 'ab' if mode=='dump' else 'rb'
def __enter__(self):
self.f = open(self.path, mode=self.mode)
return self
def dump(self,content):
pickle.dump(content,self.f)
def __exit__(self, exc_type, exc_val, exc_tb):
self.f.close()
def __iter__(self):
while True:
try:
yield pickle.load(self.f)
except EOFError:
break
class Course:
def __init__(self,name,price,period):
self.name = name
self.price = price
self.period = period
python = Course('python',19800,'6 months')
linux = Course('linux',19800,'6 months')
with MyPickle('course_file') as p:
for obj in p:
print(obj.__dict__)
with MyPickle('course_file','dump') as p:
p.dump(python)
p.dump(linux)
with open('course_file','ab') as f:
pickle.dump(linux,f)
with open('course_file','rb') as f:
while True:
try:
obj = pickle.load(f)
print(obj.__dict__)
except EOFError:
break
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

