1. 程式人生 > >python序列化_json,pickle,shelve模塊

python序列化_json,pickle,shelve模塊

救贖 pickle dumps data com pick odin 寫入 coder

序列化

序列化是指把內存裏的數據類型轉變成字符串,以使其能存儲到硬盤或通過網絡傳輸到遠程,因為硬盤或網絡傳輸時只能接受bytes

  • 把內存數據 轉成字符,叫序列化
  • 把字符 轉成內存數據,叫反序列化

模塊 json

json.dumps() 序列化一個對象

import json
data = {

    ‘roles‘:[
        {‘role‘:‘monster‘,‘type‘:‘pig‘,‘life‘:50},
        {‘role‘:‘hero‘,‘type‘:‘關羽‘,‘life‘:80},
    ]
}

d = json.dumps(data) #轉成字符串
print(type(d))
print(d)

打印結果:

<class ‘str‘>
{"roles": [{"role": "monster", "type": "pig", "life": 50}, {"role": "hero", "type": "\u5173\u7fbd", "life": 80}]}

json.lodads() 從一個對象加載數據

import json
data = {

    ‘roles‘:[
        {‘role‘:‘monster‘,‘type‘:‘pig‘,‘life‘:50},
        {‘role‘:‘hero‘,‘type‘:‘關羽‘,‘life‘:80},
    ]
}
d = json.dumps(data) #僅轉成字符串
d2 = json.loads(d)
print(type(d2),d2) 
#<class ‘dict‘>
#{‘roles‘: [{‘role‘: ‘monster‘, ‘type‘: ‘pig‘, ‘life‘: 50}, {‘role‘: ‘hero‘, ‘type‘: ‘關羽‘, ‘life‘: 80}]}

json.dump() 將一個對象序列化存入文件

import json
data = {

    ‘roles‘:[
        {‘role‘:‘monster‘,‘type‘:‘pig‘,‘life‘:50},
        {‘role‘:‘hero‘,‘type‘:‘關羽‘,‘life‘:80},
    ]
}

f = open(‘test.json‘,mode=‘w‘)
json.dump(data, f) #轉成字符並寫入文件

結果:會將 data中的數據寫入文件

技術分享圖片


json.load() 從一個打開的文件句柄加載數據

import json

f = open(‘test.json‘,‘r‘)
data = json.load(f)
print(data[‘roles‘])

打印:

[{‘role‘: ‘monster‘, ‘type‘: ‘pig‘, ‘life‘: 50}, {‘role‘: ‘hero‘, ‘type‘: ‘關羽‘, ‘life‘: 80}]

import json

f = open(‘json_file.json‘,‘w‘,encoding=‘utf-8‘)

data1 = {‘name‘:‘nurato‘,‘skill‘:‘螺旋丸‘}
data2 = [1,2,3,‘sunshine‘]
json.dump(data1, f)
json.dump(data2, f)

結果:

技術分享圖片

說明: 可以dump多次數據並寫入文件

我們現在json.load 一下

f = open(‘json_file.json‘,‘r‘,encoding=‘utf-8‘)
json.load(f)
# 程序報錯:json.decoder.JSONDecodeError

只load 一次,並且json格式有問題,會報錯


------------------------------------------------分割線------------------------------------------------


模塊pickle

import pickle

data1 = {‘name‘:‘nurato‘,‘skill‘:‘螺旋丸‘}

f = open(‘data.pkl‘,‘wb‘)
pickle.dump(data1,f)

結果:創建了一個 名為 data.pkl 的文件


import pickle

f = open(‘data.pkl‘,‘rb‘)
d = pickle.load(f)
print(type(d))
print(d)
#<class ‘dict‘>
#{‘name‘: ‘nurato‘, ‘skill‘: ‘螺旋丸‘}

關於json 和 pickle

JSON:

優點:跨語言、體積小

缺點:只能支持int\str\list\tuple\dict

Pickle:

優點:專為python設計,支持python所有的數據類型

缺點:只能在python中使用,存儲數據占空間大


---------------------------------------分割線-------------------------------------------


序列化 shelve 模塊

import shelve

f = shelve.open(‘shelve_test‘) #打開一個文件


names = [‘python‘, ‘html‘, ‘java‘]
info = {‘name‘: ‘jack‘, ‘age‘: 25}

f[‘names‘] = names
f[‘info_dic‘] = info
f.close()

結果:會創建 shelve_test 文件


import shelve

f = shelve.open(‘shelve_test‘) #打開一個文件
print(list(f.keys()))  #[‘names‘, ‘info_dic‘]
print(list(f.items())) #[(‘names‘, [‘python‘, ‘html‘, ‘java‘]), (‘info_dic‘, {‘name‘: ‘jack‘, ‘age‘: 25})]
print(f.get(‘names‘)) #[‘python‘, ‘html‘, ‘java‘]
print(f.get(‘info_dic‘)) #{‘name‘: ‘jack‘, ‘age‘: 25}

增加內容:

import shelve

f = shelve.open(‘shelve_test‘) #打開一個文件
f[‘book‘] = [1,2,3,4,5] #增加內容
f.close()

f2 = shelve.open(‘shelve_test‘)
print(list(f2.keys()))  # [‘names‘, ‘info_dic‘, ‘book‘]
print(f2[‘book‘])

我們來修改一下內容:(只能通過 f[‘book‘] = [1,2,‘肖申克的救贖‘,4,5]) 這樣的方式重新賦值來更改

f[‘book‘][0] = ‘new book‘ 這樣的方式是不可以的。

import shelve

f = shelve.open(‘shelve_test‘)  # 打開一個文件
f[‘book‘] = [1,2,‘肖申克的救贖‘,4,5]
f.close()

f2 = shelve.open(‘shelve_test‘)
print(f2[‘book‘])  # [1, 2, ‘肖申克的救贖‘, 4, 5]

刪除內容:

import shelve

f = shelve.open(‘shelve_test‘) #打開一個文件
del f[‘book‘]
f.close()

f2 = shelve.open(‘shelve_test‘)
print(list(f2.items())) 
# 打印 : [(‘names‘, [‘python‘, ‘html‘, ‘java‘]), (‘info_dic‘, {‘name‘: ‘jack‘, ‘age‘: 25})]

python序列化_json,pickle,shelve模塊