Python3.7之pickle&json模塊


一、什么叫序列化

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

二、序列化pickle模塊

pickle模塊是做什么用的

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

pickle可以存儲的數據類型

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

pickle模塊中常用的方法

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

①pickle.dumps(obj[, protocol])

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

參數講解:

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

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}

三、序列化模塊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'>

四、json vs pickle

Json:

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

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

Pickle:

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

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

五、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對象后寫入文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM