序列化模塊之json和pickle

什麼叫序列化?

將本來的字典、列表或者類的實例對象等內容轉換成一個字符串的過程就叫作序列化。python

爲何要序列化?

一、以某種存儲形式使對象(例如dict,object)持久化,例如存儲到數據庫中mysql

二、將對象從一個地方(網絡)傳遞到另外一個地方redis

image.png

用於序列化的兩個模塊:
json,用於字符串 和 python數據類型間進行轉換
pickle,用於python特有的類型 和 python的數據類型間進行轉換sql

一.json

首先明確一點:json本質上就是字符串數據庫

  • python對象->json使用json.dumps(python對象)
  • json->python對象使用json.loads(json字符串)
  • json字符串中的值必須用雙引號,見下例

在python中。只有基本的數據類型才能轉換成json格式的字符串,也即:int,float,str,list,tuple,dictjson

小技巧:如何記憶dumps和loads呢?咱們mysql,redis常用到dumps來持久化,也就是將mysql裏的數據以字符串或二進制的形式存儲到硬盤,因此對應到json中的dumps,將抽象的數據內容(python對象)轉成字符串。

將python對象dumps成json字符串

import json
pesron = [{'user':'zs','age':10},
          {'user': 'ls', 'age':20}]
x = 10
y = {'user':'zs','age':10}
json_str1 = json.dumps(pesron)
json_str2 = json.dumps(x)
json_str3 = json.dumps(y)
print(type(json_str1),type(x),type(y))
print(json_str1,json_str2,json_str3)

輸出網絡

<class 'str'> <class 'int'> <class 'dict'>
[{"user": "zs", "age": 10}, {"user": "ls", "age": 20}] 10 {"user": "zs", "age": 10}

若是咱們要想把序列化的內容寫到文件中,能夠直接使用json.dumpspa

import json
dic = {1:"a",2:"b"}
f = open('myfile','w',encoding='utf-8')
json.dump(dic,f)
f.close()

使用json.dumpsjson.dump的時候,只能存放ascii的字符,所以會將中文進行轉義,這時候咱們能夠作使用ensure_ascii=False關閉這個特性。code

將json字符串loads成python對象

import json
#json_str = "[{'user':'zs','age':10},{'user': 'ls', 'age':20}]"  錯誤,必須用雙引號
json_str1 = """[{"user":"zs","age":10},{"user": "ls", "age":20}]"""
json_str2 = """{"user":"zs","age":10}"""
json_str3 = """12"""

person = json.loads(json_str1)
x = json.loads(json_str2)
y = json.loads(json_str3)
print(type(person),type(x),type(y))
print(person,x,y)

輸出對象

<class 'list'> <class 'dict'> <class 'int'>
[{'user': 'zs', 'age': 10}, {'user': 'ls', 'age': 20}] {'user': 'zs', 'age': 10} 12

二.pickle

pickle能夠序列化任意的數據類型,包括集合和類的對象實例

import pickle

class ABC:
    a = 10

    def __init__(self,m,n):
        self.m = m
        self.n = n

abc = ABC(1,2)
res = pickle.dumps(abc)
back_res = pickle.loads(res)
print(res)
print(back_res)
print(back_res.a)

輸出結果

b'\x80\x03c__main__\nABC\nq\x00)\x81q\x01}q\x02(X\x01\x00\x00\x00mq\x03K\x01X\x01\x00\x00\x00nq\x04K\x02ub.'
<__main__.ABC object at 0x10999fba8>
10

注意:將pickle.dumps的數據寫到文件的時候,文件必須使用rb的模式打開後wb的模式寫入

相關文章
相關標籤/搜索