序列化和反序列化
eval內置方法可以將一個字符串轉成python對象,不過,eval方法是有局限性的,對於普通的數據類型,json.loads和eval都能用,但遇到特殊類型的時候,eval就不管用了,所以eval的重點還是通常用來執行一個字符串表達式,並返回表達式的值。
我們把對象(變量)從內存中變成可存儲或傳輸的過程稱之為序列化,在Python中叫pickling,在其他語言中也被稱之為serialization,marshalling,flattening等等,都是一個意思。
為什么要序列化?
1:持久保存狀態
在斷電或重啟程序之前將程序當前內存中所有的數據都保存下來(保存到文件中),以便於下次程序執行能夠從文件中載入之前的數據,然后繼續執行,這就是序列化。
2:跨平台數據交互
序列化之后,不僅可以把序列化后的內容寫入磁盤,還可以通過網絡傳輸到別的機器上,如果收發的雙方約定好實用一種序列化的格式,那么便打破了平台/語言差異化帶來的限制,實現了跨平台數據交互。
在python中,有專門處理json格式的模塊—— json 和 picle模塊
json :序列化
JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式。JSON的數據格式其實就是python里面的字典格式,里面可以包含方括號括起來的數組,也就是python里面的列表。
Json 模塊提供了四個方法: dumps、dump、loads、load
dumps和dump 序列化方法
序列化成字符串:json.dumps(json_obj)
序列化字符串到文件中:json.dump(json_obj, write_file)
import json
# 將json類型的對象與json類型的字符串相互轉換
# {} 與 [] 嵌套形成的數據(python中建議數據的從{}開始)
dic = {
'a': 1,
'b': [1, 2, 3, 4, 5]}
# 序列化: 將python的字典轉化為字符串傳遞給其他語言或保存
json_str = json.dumps(dic)
print(json_str)
with open('1', 'w', encoding='utf-8') as w:
json.dump(dic, w) # 先將dic對象轉化為字符串,再寫入文件
# w.write(dic)
loads和load 反序列化方法
反序列化成對象:json.loads(json_str)
從文件讀流中反序列化成對象:json.load(read_file)
import json
# 反序列化
json_str = '''{"a": 1, "b": ['1', 2, 3, 4, 5]}'''
# json_str = "{'a': 1, 'b': [1, 2, 3, 4, 5]}"
json類型的字符串不認單引號''
json_str = '''{"a": 1, "b": [1, 2, 3, 4, 5]}'''
new_dic = json.loads(json_str)
print(new_dic, type(new_dic))
with open('1', 'r', encoding='utf-8') as r:
res = json.load(r)
print(res)
pickle :序列化
pickle 模塊提供了四個方法: dumps、dump、loads、load
dumps和dump 序列化方法
序列化成字符串:json.dumps(json_obj)
序列化字符串到文件中:json.dump(json_obj, write_file)
import pickle
dic = {
'a': 1,
'b': [1, 2, 3, 4, 5]
}
with open('2', 'wb') as w:
pickle.dump(dic, w)
loads和load 反序列化方法
反序列化成對象:json.loads(json_str)
從文件讀流中反序列化成對象:json.load(read_file)
import pickle
dic = {
'a': 1,
'b': [1, 2, 3, 4, 5]
}
with open('2', 'rb') as r:
print(pickle.load(r))
json模塊和picle模塊都有 dumps、dump、loads、load四種方法,而且用法一樣。
不一樣的是json模塊序列化出來的是通用格式,其它編程語言都認識,就是普通的字符串,
而picle模塊序列化出來的只有python可以認識,其他編程語言不認識的,表現為亂碼