Python 學習筆記 - 序列化和反序列化

這一節看看在Python中如何序列化和反序列化。簡單的說,序列化就是把內存中保存的數據類型轉換爲可以存儲或者傳輸的過程,比如說我把一個字典轉換爲一個字符串這樣就可以方便傳遞或者保存了;反序列化則是倒過來,把字符串轉換爲對應的數據類型。


Python裏面常用的有兩種方式。


  1. JSON

  2. Pickle



首先來看看JSON,


例1 比如說我有一個字典如下所示:


>>> import json
dic={"k1":"v1"}
print(dic,type(dic))
-------------------------
{'k1': 'v1'} <class 'dict'>

通過 json.dumps就能轉換爲字符串了

>>> result=json.dumps(dic)
print(result,type(result))
--------------------------
{"k1": "v1"} <class 'str'>


倒過來,如何把字符串轉換成對應的結構呢?

可以用json.loads ; 前面學函數的時候學了eval,他也可以的

>>> s='{"k1":"v1"}'
dic=json.loads(s)
dic2=eval(s)
# dic3=pickle.loads(s)
print(dic,type(dic))
print(dic2,type(dic2))
---------------------
{'k1': 'v1'} <class 'dict'>
{'k1': 'v1'} <class 'dict'>


例2: 調用http request獲取一個天氣的json格式的字符串,然後把他轉換成字典輸出

>>> import requests
import json
response = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京')
response.encoding = 'utf-8'
dic = json.loads(response.text)
print(dic)
print(type(dic))
---------------
{'desc': 'OK', 'status': 1000, 'data': {'forecast': [{'fengxiang': '無持續風向', 'fengli': '微風級', 'type': '晴', 'high': '高溫 31℃', 'date': '7日星期三', 'low': '低溫 19℃'}, {'fengxiang': '北風', 'fengli': '3-4級', 'type': '晴', 'high': '高溫 31℃', 'date': '8日星期四', 'low': '低溫 19℃'}, {'fengxiang': '無持續風向', 'fengli': '微風級', 'type': '晴', 'high': '高溫 31℃', 'date': '9日星期五', 'low': '低溫 18℃'}, {'fengxiang': '無持續風向', 'fengli': '微風級', 'type': '多雲', 'high': '高溫 30℃', 'date': '10日星期六', 'low': '低溫 18℃'}, {'fengxiang': '無持續風向', 'fengli': '微風級', 'type': '陣雨', 'high': '高溫 25℃', 'date': '11日星期天', 'low': '低溫 17℃'}], 'wendu': '27', 'yesterday': {'low': '低溫 21℃', 'type': '多雲', 'high': '高溫 30℃', 'fx': '無持續風向', 'date': '6日星期二', 'fl': '微風'}, 'city': '北京', 'aqi': '82', 'ganmao': '各項氣象條件適宜,發生感冒機率較低。但請避免長期處於空調房間中,以防感冒。'}}
<class 'dict'>


例3.  序列化,反序列化列表也是可以。反序列化的時候,需要外面用單引號,裏面用雙引號

>>> r = json.dumps([11,22,33])
print(r,type(r)
li = '["alex", "eric"]'
ret = json.loads(li)  # 反序列化時,一定要使用   "
print(ret,type(ret))
-----------------------
[11, 22, 33] <class 'str'>
['alex', 'eric'] <class 'list'>


JSON不僅可以在字符串和數據類型之間轉換,還可以進一步把字符串寫入文件,或者倒過來。

例如 json.load和json.dump多做了一步文件的操作


li = [11,22,33]
json.dump(li,open('db','w'))
li = json.load(open('db','r'))
print(type(li),li)



第二個常見的方法是通過pickle


pickle是python自己特有的方法,他會把數據結構轉換爲特殊的字符串格式,他的優點是可以支持各種複雜類的操作;而json轉換的字符串所以的編程語言都能識別,不過只能支持基本的數據類型,比如列表,字典等等。


例 可以看見他的字符串是2進制的

li = [11,22,33]
r = pickle.dumps(li)
print(r)
result = pickle.loads(r)
print(result)
-----------
b'\x80\x03]q\x00(K\x0bK\x16K!e.'
[11, 22, 33]

因此,當寫入文件的時候,也需要用2進制格式

li = [11,22,33]
pickle.dump(li, open('db', 'wb'))


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章