Python 基礎之序列化模塊pickle與json

:pickle 序列化模塊
把不可以直接存儲的數據,變得可存儲就是序列化
把存儲好的數據,轉化成本來的數據類型,加作反序列化

php: 序列化和反序列化
(1)serialize
(2)unserialize


#1.dumps 把任意對象序列化成一個bytes
#:php

#導入pickle模塊 => 模塊.方法()
import picklepython

lst = [1,2,3,4,5,6]
res = pickle.dumps(lst)
print(res,type(res))
#b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04K\x05K\x06e.' <class 'bytes'>
#2.loads 把任意bytes反序列化成原來數據編程

res = pickle.loads(res)
print(res,type(res))

#encode decode 能實現序列化嗎?
'''只有字符串能夠使用encode 或 decode ,容器類型數據等不能夠'''
#res = lst.encode("utf-8")
#print(res)

#對函數進行序列化json

#2:編程語言

import pickle
def func():
    print("哈哈哈哈哈哈哈哈哈哈")
func()
# 序列化成字符串
res = pickle.dumps(func)
print(res)
#反序列化字節流 恢復原來的數據類型
res = pickle.loads(res)
print(res)
res()
對函數序列化例2輸出結果爲:函數

哈哈哈哈哈哈哈哈哈哈spa

b'\x80\x03c__main__\nfunc\nq\x00.'code

<function func at 0x00000208DE411E18>對象

哈哈哈哈哈哈哈哈哈哈排序


#對迭代器進行序列化

import pickle
it = iter(range(10))
from collections import Iterable,Iterator
print(isinstance(it,Iterator))
res = pickle.dumps(it) #序列化
res = pickle.loads(res) #反序列化
for i in res:
    print(i) #輸出:0 1 2 3 4 5 6 7 8 9

#全部數據類型均可以經過pickle模塊進行序列化
#dump 把對象序列化後寫入到file_like Object(即文件對象)
#load file_like Object(即文件對象)中的內容拿出來,反序列化原來數據

it = iter(range(10))
with open("ceshi.pkl",mode="wb") as fp:
    pickle.dump(it,fp)

with open("ceshi.pkl",mode="rb") as fp:
    res = pickle.load(fp)

print(res)
for i in res:
    print(i)

:json
json 模塊可以轉化的數據類型以下:int float bool str list tuple dict None 8個數據能夠序列化
json 數據類型的提出,是讓不一樣的語言之間造成數據交流
pickle 返回的是二進制的字節流,它是用來進行數據的傳輸和存儲的
json     序列化成一個字符串
pickle   序列化成一個字節流
#:
import json
#dumps  loads 是一對,用來序列化和反序列化的,在字符串和其餘數據之間切換
#序列化
#ensure_ascii = True 若是想要顯示中文ensure_ascii = False
#sort_keys = True 對字典的鍵進行排序(默認按照ascii從小到大排序)
#1:
dic = {'name':"ONE","age":8,"sex":"BOY","family":['FF',"MM"]}
res = json.dumps(dic,ensure_ascii=True,sort_keys=True)
print(res,type(res)) #{"age": 8, "family": ["FF", "MM"], "name": "ONE", "sex": "BOY"} <class 'str'>
#反序列化
res = json.loads(res)
print(res,type(res)) #{'age': 8, 'family': ['FF', 'MM'], 'name': 'ONE', 'sex': 'BOY'} <class 'dict'>

# #dump  load 是一對,用來進行數據的存儲和提取
#2:(dic寫入到ceshi001.json到在經過load讀出)

dic = {'name':"ONE","age":8,"sex":"BOY","family":['FF',"MM"]}
with open("ceshi001.json",mode="w",encoding="utf-8") as fp:
    res1 = json.dump(dic,fp,ensure_ascii=False)
with open("ceshi001.json",mode="r",encoding="utf-8") as fp:
    res = json.load(fp)
print(res,type(res)) 

 

:json  pickle 兩個模塊之間的區別
#json
能夠連續dump,可是load只能一次性把全部數據拿出來,進行反序列化,形成數據錯誤
針對於這個弊端,能夠使用loads來解決

dic = {'a':1,'b':2}
with open('ceshi002.json',mode="w",encoding='utf-8') as fp:
    json.dump(dic,fp)
    fp.write('\n')
    json.dump(dic,fp)
    fp.write('\n')
print("=====================")
with open("ceshi002.json",mode="r",encoding="utf-8") as fp:
    #res = json.load(fp) error
    for i in fp:
        #讀一行,反序列化成一個字典,一次循環
        res= json.loads(i)
        print(res,type(res))


#pickle
容許連續dump,也容許連續load
#1:
import pickle
dic = {'a':3,'b':4}
with open("ceshi003.pkl",mode="wb") as fp:
    pickle.dump(dic,fp)
    pickle.dump(dic,fp)
    pickle.dump(dic,fp)
    pickle.dump(dic,fp)

with open("ceshi003.pkl",mode="rb") as fp:
    '''
    res = pickle.load(fp)
    print(res)
    res = pickle.load(fp)
    print(res)
    res = pickle.load(fp)
    print(res)
    res = pickle.load(fp)
    print(res)
    '''
    #res = pickle.load(fp)
    #print(res)

   #是否能夠把全部數據都一次性拿出來
   #try...except..抑制多調用的那一次的報
#異常格式    

try:
        while True:
            res = pickle.load(fp)
            print(res)

    except:
        pass

json  pickle 兩個模塊的區別總結
(1) json序列化以後的數據類型是str ,全部編程語言都識別
    可是僅限於(int float bool )(str list tuple dict None)
    json不能連續load,只能一次性拿出來全部數據
    
(2)pickle序列化以後的呼聲類型是bytes,
    全部數據類型均可以轉化,但僅限於python之間的存儲傳輸
    pickle能夠連續load,多套數據放在同一個文件中

相關文章
相關標籤/搜索