#序列化使用場景:寫檔案(資料儲存)、網路上傳輸的時候dic =
print(type(dic),dic)
過程:從資料型別 --> 字串的過程 (序列化)
過程:從字串 ---> 資料型別的過程 (反序列化)
json 模組
pickle 模組
shelve 模組
json --
優點:通用的序列化格式
缺點:只有很少的一部分資料型別能夠通過json轉化成字串
# json 方法:dumps序列化方法 loads反序列化方法----直接再記憶體裡操作# 注意:json本身使用的就是單引號'',但是序列化後,''單引號裡所有的單引號都會變為雙引號""
# 適用場景:數字、字串、列表、字典、元組
# 元組是特殊的序列化,序列化後轉為了str([1,2,3,4]),反序列化後變成了列表資料型別
import json
str_d = json.dumps(dic) # 序列化
print(type(str_d),str_d)
dic_d = json.loads(str_d) # 反序列化
print(type(dic_d),dic_d)
tup = (1,2,3,4)
str_t = json.dumps(tup) # 序列化
print(type(str_t),str_t)
tup_t = json.loads(str_t) # 反序列化
print(type(tup_t),tup_t)
json 方法:dump序列化方法 load反序列化方法 --- 在檔案裡操作,將資料型別轉換後寫入到檔案,或者從檔案裡讀出來
# 寫入到檔案
dic1 =
with open('ffff','w',encoding='utf-8') as f:
json.dump(dic1,f)
# 從檔案裡讀取出來
# with open('ffff','r',encoding='utf-8') as f:
# res = json.load(f)
# print(type(res),res)
# 當向檔案裡寫入中文時,寫入檔案裡的其實是bytes型別的dic1 =
with open('ffff','w',encoding='utf-8') as f:
json.dump(dic1,f)
# 解決方法 新增方法ensure_ascii=false
dic1 =
with open('ffff','w',encoding='utf-8') as f:
json.dump(dic1,f,ensure_ascii=false)
# 問題:load是一次性往外讀取,還是一條條往外讀取pickle# 解答:取決於dump是一次性寫入,還是dump多次寫入
# 正解:只能dump一次性寫入,才能load一次性往外讀
# 解決方式:使用dumps迴圈寫入,使用loads迴圈讀出
# dic1 =
# with open('ffff','w',encoding='utf-8') as f:
# json.dump(dic1,f,ensure_ascii=false)
# json.dump(dic1, f, ensure_ascii=false)
# 上面是兩次寫入,你一次只讀取一次,程式報錯
# with open('ffff','r',encoding='utf-8') as f:
# ret = json.load(f)
# print(ret)
# 正確操作方法一:使用dumps迴圈寫入到檔案,接著使用loads迴圈讀出
import json
# l = [,,,]
# with open('file','w',encoding='utf-8') as f:
# for i in l:
# str_d = json.dumps(i)
# f.write(str_d+'\n')
with open('file','r',encoding='utf-8') as f:
l =
for i in f:
print(i.strip())
dic_d = json.loads(i.strip())
print(l)
所有的python中的資料型別都可以轉化成字串形式
缺點:pickle序列化的內容只有python能理解,且部分反序列化依賴**
常用場景:比如儲存人物遊戲狀態下的所有資訊
# pickle# 方法和json 一樣:dumps loads dump load
# 注意:pickle進行序列化的時候都是序列化成bytes,所以dumps後的內容都是bytes型別的,且呼叫dump、load時,使用的是wb\rb的方法
# pickle 支援分次load,json 不支援
import pickleshelve# # 因為dumps後的是bytes資料型別
dic =
str_d = pickle.dumps(dic) # 序列化
print(type(str_d), str_d)
dic_d = pickle.loads(str_d) # 反序列化
print(type(dic_d), dic_d)
# 可以分次dump 寫入檔案,也可以分次load讀出檔案,注意檔案操作時使用wb/rb
# with open("test", 'wb') as f:
# pickle.dump(dic,f)
# pickle.dump(dic,f)
# pickle.dump(dic,f)
with open('test','rb') as f:
ret = pickle.load(f)
ret1 = pickle.load(f)
print(ret)
print(ret1)
shelve 控制代碼,序列號控制代碼
優點:使用控制代碼直接操作,非常方便
缺點:不支援多個應用同一時間往同乙個db進行寫操作。所以當我們知道我們的應用如果只進行讀操作,我們可以讓shelve通過唯讀方式開啟db
import shelve由於shelve在預設情況下是不會記錄待持久化物件的任何修改的,所以我們在shelve.open()時候需要修改預設引數,否則物件的修改不會儲存。f = shelve.open('shelve_file')
f['key'] = #直接對檔案控制代碼操作,就可以存入資料
f.close()
import shelve
f1 = shelve.open('shelve_file')
existing = f1['key'] #取出資料的時候也只需要直接用key獲取即可,但是如果key不存在會報錯
f1.close()
print(existing)
import shelvewriteback方式有優點也有缺點。優點是減少了我們出錯的概率,並且讓物件的持久化對使用者更加的透明了;但這種方式並不是所有的情況下都需要,首先,使用writeback以後,shelf在open()的時候會增加額外的記憶體消耗,並且當db在close()的時候會將快取中的每乙個物件都寫入到db,這也會帶來額外的等待時間。因為shelve沒有辦法知道快取中哪些物件修改了,哪些物件沒有修改,因此所有的物件都會被寫入。f = shelve.open('shelve_file', flag='r')
existing = f['key']
f.close()
print(existing)
import shelvef1 = shelve.open('shelve_file')
print(f1['key'])
f1['key']['new_value'] = 'this was not here before'
f1.close()
f2 = shelve.open('shelve_file', writeback=true)
print(f2['key'])
f2['key']['new_value'] = 'this was not here before'
f2.close()
python 序列化模組 python 序列化模組
一 介紹 1 分類 序列化 資料型別 字串 反序列化 字串 資料型別 2 作用 檔案傳輸和檔案儲存需要將資料型別轉換成字串 二 序列號模組分類 1 json 優點 程式語言中的英語,同用語言 缺點 資料型別少 數字 字串 列表 字典 元祖 通過列表進行的 2 pickle 優點 python的所有資...
python 序列化模組
1 分類 序列化 資料型別 字串 反序列化 字串 資料型別 2 作用 檔案傳輸和檔案儲存需要將資料型別轉換成字串 1 json 優點 程式語言中的英語,同用語言 缺點 資料型別少 數字 字串 列表 字典 元祖 通過列表進行的 2 pickle 優點 python的所有資料型別 缺點 不通用,只能在p...
python模組 序列化
主要內容 1.序列化模組.json pickle shelve 了解 序列化模組 為了把資料用於網路傳輸,以及檔案的讀寫操作.序列化 將資料轉化成序列化字串.反序列化 將序列化字串轉化成原資料.序列化模組 序列化是創造乙個序列.如何把乙個字典傳給其他人,依賴之前的知識也可以做到,參考如下 dic s...