Python中Json 和 pickle 詳解


序列化和反序列化

​ 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可以認識,其他編程語言不認識的,表現為亂碼


免責聲明!

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



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