這一節看看在Python中如何序列化和反序列化。簡單的說,序列化就是把內存中保存的數據類型轉換爲能夠存儲或者傳輸的過程,好比說我把一個字典轉換爲一個字符串這樣就能夠方便傳遞或者保存了;反序列化則是倒過來,把字符串轉換爲對應的數據類型。python
Python裏面經常使用的有兩種方式。編程
JSONjson
Pickle數據結構
首先來看看JSON,編程語言
例1 好比說我有一個字典以下所示:ide
>>> 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'>
倒過來,如何把字符串轉換成對應的結構呢?cdn
能夠用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格式的字符串,而後把他轉換成字典輸出utf-8
>>> 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'))