Python學習之路 序列化模組

2021-09-12 08:34:26 字數 4288 閱讀 2760

#序列化

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是一次性往外讀取,還是一條條往外讀取

# 解答:取決於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)

pickle

所有的python中的資料型別都可以轉化成字串形式

缺點:pickle序列化的內容只有python能理解,且部分反序列化依賴**

常用場景:比如儲存人物遊戲狀態下的所有資訊

# pickle

# 方法和json 一樣:dumps loads dump load

# 注意:pickle進行序列化的時候都是序列化成bytes,所以dumps後的內容都是bytes型別的,且呼叫dump、load時,使用的是wb\rb的方法

# pickle 支援分次load,json 不支援

import pickle

# # 因為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

shelve 控制代碼,序列號控制代碼

優點:使用控制代碼直接操作,非常方便

缺點:不支援多個應用同一時間往同乙個db進行寫操作。所以當我們知道我們的應用如果只進行讀操作,我們可以讓shelve通過唯讀方式開啟db

import shelve

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)

由於shelve在預設情況下是不會記錄待持久化物件的任何修改的,所以我們在shelve.open()時候需要修改預設引數,否則物件的修改不會儲存。

import shelve

f = shelve.open('shelve_file', flag='r')

existing = f['key']

f.close()

print(existing)

writeback方式有優點也有缺點。優點是減少了我們出錯的概率,並且讓物件的持久化對使用者更加的透明了;但這種方式並不是所有的情況下都需要,首先,使用writeback以後,shelf在open()的時候會增加額外的記憶體消耗,並且當db在close()的時候會將快取中的每乙個物件都寫入到db,這也會帶來額外的等待時間。因為shelve沒有辦法知道快取中哪些物件修改了,哪些物件沒有修改,因此所有的物件都會被寫入。

import shelve

f1 = 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...