python-->json和pickle模塊

1、json和pickle模塊

1.1 序列化

把對象(變量)從內存中變成可存儲或傳輸的過程稱之爲序列化,在Python中叫pickling,在其餘語言中也被稱之爲serialization,marshalling,flattening。python

序列化的優勢:編程

  1. 持久保存狀態:內存是沒法永久保存數據的,當程序運行了一段時間,咱們斷電或者重啓程序,內存中關於這個程序的以前一段時間的數據(有結構)都被清空了。可是在斷電或重啓程序以前將程序當前內存中全部的數據都保存下來(保存到文件中),以便於下次程序執行可以從文件中載入以前的數據,而後繼續執行,這就是序列化。
  2. 跨平臺數據交互:序列化時不只能夠把序列化後的內容寫入磁盤,還能夠經過網絡傳輸到別的機器上,若是收發的雙方約定好實用一種序列化的格式,那麼便打破了平臺/語言差別化帶來的限制,實現了跨平臺數據交互。

1.2 json

json模塊:json

  1. 用python寫了一個程序,用java寫了一門程序,這兩個程序須要數據之間交流,規定了一種多種語言通用的數據類型
  2. json串:
    1. 序列化:從python的字典(最經常使用)變成json串, dump
    2. 反序列化:從json串變成python的字典(最經常使用),load

Json序列化並非python獨有的,json序列化在java等語言中也會涉及到,所以使用json序列化可以達到跨平臺傳輸數據的目的。網絡

json數據類型和python數據類型對應關係表編程語言

Json類型 Python類型
{} dict
[] list
"string" str
520.13 int或float
true/false True/False
null None

json模塊序列化和反序列化的一個過程以下圖所示code

json模塊

# 序列化
with open('Json序列化對象.json', 'w') as fw:
    json.dump(struct_data, fw)
# 反序列化
with open('Json序列化對象.json') as fr:
    data = json.load(fr)
print(data)
{'name': 'json', 'age': 23, 'sex': 'male'}
import json
struct_data = {'name': 'json', 'age': 23, 'sex': 'male'}
print(struct_data, type(struct_data))

#
{'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
data = json.dumps(struct_data)
print(data, type(data))
#
{"name": "json", "age": 23, "sex": "male"} <class 'str'>
# 注意:不管數據是怎樣建立的,只要知足json格式(若是是字典,則字典內元素都是雙引號),就能夠json.loads出來,不必定非要dumps的數據才能loads
data = json.loads(data)
print(data, type(data))
#
{'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>

1.3 pickle

Pickle序列化和全部其餘編程語言特有的序列化問題同樣,它只能用於Python,而且可能不一樣版本的Python彼此都不兼容,所以,只能用Pickle保存那些不重要的數據,即不能成功地反序列化也不要緊。可是pickle的好處是能夠存儲Python中的全部的數據類型,包括對象,而json不能夠。對象

pickle模塊序列化和反序列化的過程以下圖所示blog

pickle模塊

# 序列化(注意:pickle模塊須要使用二進制存儲,即'wb'模式存儲)
with open('Pickle序列化對象.pkl', 'wb') as fw:
    pickle.dump(struct_data, fw)
# 反序列化
with open('Pickle序列化對象.pkl', 'rb') as fr:
    pickle = pickle.load(fr)
print(data)
#
{'name': 'json', 'age': 23, 'sex': 'male'}
import pickle
struct_data = {'name': 'json', 'age': 23, 'sex': 'male'}
print(struct_data, type(struct_data))
#
{'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
data = pickle.dumps(struct_data)
print(data, type(data))
#
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00jsonq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x03\x00\x00\x00sexq\x04X\x04\x00\x00\x00maleq\x05u.' <class 'bytes'>
data = pickle.loads(data)
print(data, type(data))
#
{'name': 'json', 'age': 23, 'sex': 'male'} <class 'dict'>
相關文章
相關標籤/搜索