Python3.7之pickle&json模塊

Python3.7之pickle&json模塊

1、什麼叫序列化

序列化是將對象狀態轉換爲可保持或傳輸的格式的過程。與序列化相對的是反序列化,它將流轉換爲對象。這兩個過程結合起來,能夠輕鬆地存儲和傳輸數據。python

2、序列化pickle模塊

pickle模塊是作什麼用的

用來存取結構化數據。用於python特有的類型和python的數據類型間進行轉換。json

pickle能夠存儲的數據類型

①全部python支持的原生類型:布爾值,整數,浮點數,複數,字符串,字節,None;
②由任何原生類型組成的列表,元組,字典和集合;
③函數,類,類的實例。數據結構

pickle模塊中經常使用的方法

pickle提供四個功能:dumps,dump,loads,load函數

①pickle.dumps(obj[, protocol])

函數的功能:將obj對象序列化爲string形式,而不是存入文件中(以字節對象形式返回封裝的對象,不須要寫入文件中)。設計

參數講解:code

obj:想要序列化的obj對象。orm

protocal:若是該項省略,則默認爲0。若是爲負值或HIGHEST_PROTOCOL,則使用最高的協議版本。對象

# dumps功能
# dumps 將數據經過特殊的形式轉換爲只有python語言認識的字符串
import pickle
info = {
    'name': 'Vivian',
    'age': 20,
    'height': 157
}

data = pickle.dumps(info)  # dumps會把數據變成bytes形式
print(data)

# 輸出
# b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00Vivianq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x06\x00\x00\x00heightq\x04K\x9du.'

②pickle.dump(obj, file, protocol=None,)

函數的功能:將obj對象序列化存入已經打開的file中。內存

參數講解:字符串

必填參數obj表示將要封裝的對象

必填參數file表示obj要寫入的文件對象,file必須以二進制可寫模式打開,即「wb」

注:一個字典a = {'name':'Tom','age':22},用pickle.dump存到本地文件,所存數據的結構就是字典,而普通的file.write寫入文件的是字符串。

# dump功能
# dump 將數據經過特殊的形式轉換爲只有python語言認識的字符串,並寫入文件
import pickle
info = {
    'name': 'Vivian',
    'age': 20,
    'height': 157
}

with open('information.pkl', 'wb') as f:
    pickle.dump(info, f)

③pickle.loads(string)

函數的功能:反序列化。從string中讀出序列化前的obj對象(從字節對象中讀取被封裝的對象,並返回)。

參數講解:

string:文件名稱。

# loads功能
# loads  將pickle數據轉換爲python的數據結構
import pickle
info = {
    'name': 'Vivian',
    'age': 20,
    'height': 157
}

data1 = pickle.dumps(info)
print(data1)
data2 = pickle.loads(data1)
print(data2)

# 輸出
# b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00Vivianq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x06\x00\x00\x00heightq\x04K\x9du.'
# {'name': 'Vivian', 'age': 20, 'height': 157}

④pickle.load(file)

函數的功能:load對象反序列化,從文件讀取數據,將file中的對象序列化讀出。

參數講解:

file:文件名稱。必填參數file必須以二進制可讀模式打開,即「rb」,其餘都爲可選參數。

# load功能
# load 從數據文件中讀取數據,並轉換爲python的數據結構
import pickle
with open('information.pkl', 'rb') as f:
    print(pickle.load(f))
    
# 輸出
# {'name': 'Vivian', 'age': 20, 'height': 157}

3、序列化模塊json

json模塊是作什麼用的

用來存取結構化數據。用於字符串和Python數據類型間進行轉換。

json能夠存儲的數據類型

只能支持int\str\list\tuple\dict

json模塊中經常使用的方法

json提供四個功能:dumps,dump,loads,load

①字典轉成json串

文件裏只能寫字符串,但能夠把字典轉成json串,json串是字符串,能夠存到文件裏。

# json.dumps 將數據經過特殊的形式轉換位全部程序語言都認識的字符串
import json
info = {
    'name': 'Vivian',
    'age': 20,
    'height': 157
}
j_str = json.dumps(info)  # 注意json dumps生成的是字符串,不是bytes
print(j_str)
print(type(j_str))

# 輸出
# {"name": "Vivian", "age": 20, "height": 157}
# <class 'str'>
# 使用.dump()方法前,要先打開文件,再寫入
with open('massage.json', 'w') as f:
    json.dump(info, f)

②json串轉成字典

# json.loads 用於解碼 JSON 數據。該函數返回 Python 字段的數據類型
print(json.loads(j_str))
print(type(json.loads(j_str)))

# 輸出
# {'name': 'Vivian', 'age': 20, 'height': 157}
# <class 'dict'>
with open('massage.json') as f:
    data = json.load(f)
    print(data)
    print(type(data))

# {"name": "Vivian", "age": 20, "height": 157}
# <class 'dict'>

4、json vs pickle

Json:

優勢:跨語言(不一樣語言間的數據傳遞可用json交接)、體積小

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

Pickle:

優勢:專爲python設計,支持python全部的數據類型

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

5、load vs loads

load和loads都是實現「反序列化」,區別在於:

loads針對內存對象

即將Python內置數據序列化爲字串。如使用json.dumps序列化的對象d_json=json.dumps({'a':1, 'b':2}),在這裏d_json是一個字串'{"b": 2, "a": 1}'
d=json.loads(d_json) #{ b": 2, "a": 1},使用load從新反序列化爲dict

load針對文件句柄

如本地有一個json文件a.json則能夠d=json.load(open('a.json'))

相應的,dump就是將內置類型序列化爲json對象後寫入文件

相關文章
相關標籤/搜索