在python中,序列化可以理解為:把python的對象編碼轉換為json格式的字符串,反序列化可以理解為:把json格式
字符串解碼為python數據對象。在python的標准庫中,專門提供了json庫與pickle庫來處理這部分。
先來學習json的庫,導入json庫很簡單,直接import json,下面通過具體的實例來說明json庫對序列化與反序列化的使用。json庫的主要方法為:
#!/usr/bin/env python #coding:utf-8 import json print json.__all__
見json庫的主要方法:
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']
我們定義一個字典,通過json把它序列化為json格式的字符串,見實現的代碼:
#!/usr/bin/env python #coding:utf-8 import json dict1={'name':'wuya','age':22,'address':'xian'} print u'未序列化前的數據類型為:',type(dict1) print u'未序列化前的數據:',dict1 #對dict1進行序列化的處理 str1=json.dumps(dict1) print u'序列化后的數據類型為:',type(str1) print u'序列化后的數據為:',str1
見如上的代碼輸出的內容:
C:\Python27\python.exe D:/git/Python/doc/index.py 未序列化前的數據類型為: <type 'dict'> 未序列化前的數據: {'age': 22, 'name': 'wuya', 'address': 'xian'} 序列化后的數據類型為: <type 'str'> 序列化后的數據為: {"age": 22, "name": "wuya", "address": "xian"} Process finished with exit code 0
通過如上的代碼以及結果可以看到,這就是一個序列化的過程,簡單的說就是把python的數據類型轉換為json格式的
字符串。下來我們再反序列化,把json格式的字符串解碼為python的數據對象,見實現的代碼和輸出:
#!/usr/bin/env python #coding:utf-8 import json dict1={'name':'wuya','age':22,'address':'xian'} print u'未序列化前的數據類型為:',type(dict1) print u'未序列化前的數據:',dict1 #對dict1進行序列化的處理 str1=json.dumps(dict1) print u'序列化后的數據類型為:',type(str1) print u'序列化后的數據為:',str1 #對str1進行反序列化 dict2=json.loads(str1) print u'反序列化后的數據類型:',type(dict2) print u'反序列化后的數據:',dict2
見輸出結果的內容:
C:\Python27\python.exe D:/git/Python/doc/index.py 未序列化前的數據類型為: <type 'dict'> 未序列化前的數據: {'age': 22, 'name': 'wuya', 'address': 'xian'} 序列化后的數據類型為: <type 'str'> 序列化后的數據為: {"age": 22, "name": "wuya", "address": "xian"} 反序列化后的數據類型: <type 'dict'> 反序列化后的數據: {u'age': 22, u'name': u'wuya', u'address': u'xian'}
下面我們結合requests庫,來看返回的json數據,具體代碼為:
#!/usr/bin/env python #coding:utf-8 import json import requests r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安') print r.text,u'數據類型:',type(r.text) #對數據進行反序列化的操作 dic=json.loads(r.text) print dic,u'數據類型:',type(dic)
見輸出的內容:
C:\Python27\python.exe D:/git/Python/doc/index.py {"desc":"OK","status":1000,"data":{"wendu":"3","ganmao":"晝夜溫差較大,較易發生感冒,請適當增減衣服。體質較弱的朋友請注意防護。","forecast":[{"fengxiang":"東北風","fengli":"微風級","high":"高溫 10℃","type":"晴","low":"低溫 -2℃","date":"22日星期四"},{"fengxiang":"東北風","fengli":"微風級","high":"高溫 8℃","type":"多雲","low":"低溫 0℃","date":"23日星期五"},{"fengxiang":"東北風","fengli":"微風級","high":"高溫 7℃","type":"陰","low":"低溫 0℃","date":"24日星期六"},{"fengxiang":"東北風","fengli":"微風級","high":"高溫 1℃","type":"雨夾雪","low":"低溫 -1℃","date":"25日星期天"},{"fengxiang":"東北風","fengli":"微風級","high":"高溫 5℃","type":"多雲","low":"低溫 1℃","date":"26日星期一"}],"yesterday":{"fl":"微風","fx":"北風","high":"高溫 7℃","type":"陰","low":"低溫 -1℃","date":"21日星期三"},"aqi":"87","city":"西安"}} 數據類型: <type 'unicode'> {u'status': 1000, u'data': {u'city': u'\u897f\u5b89', u'yesterday': {u'fx': u'\u5317\u98ce', u'type': u'\u9634', u'high': u'\u9ad8\u6e29 7\u2103', u'low': u'\u4f4e\u6e29 -1\u2103', u'date': u'21\u65e5\u661f\u671f\u4e09', u'fl': u'\u5fae\u98ce'}, u'forecast': [{u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 10\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'22\u65e5\u661f\u671f\u56db', u'type': u'\u6674', u'low': u'\u4f4e\u6e29 -2\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 8\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'23\u65e5\u661f\u671f\u4e94', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 0\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 7\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'24\u65e5\u661f\u671f\u516d', u'type': u'\u9634', u'low': u'\u4f4e\u6e29 0\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 1\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'25\u65e5\u661f\u671f\u5929', u'type': u'\u96e8\u5939\u96ea', u'low': u'\u4f4e\u6e29 -1\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 5\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'26\u65e5\u661f\u671f\u4e00', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 1\u2103'}], u'ganmao': u'\u663c\u591c\u6e29\u5dee\u8f83\u5927\uff0c\u8f83\u6613\u53d1\u751f\u611f\u5192\uff0c\u8bf7\u9002\u5f53\u589e\u51cf\u8863\u670d\u3002\u4f53\u8d28\u8f83\u5f31\u7684\u670b\u53cb\u8bf7\u6ce8\u610f\u9632\u62a4\u3002', u'wendu': u'3', u'aqi': u'87'}, u'desc': u'OK'} 數據類型: <type 'dict'> Process finished with exit code 0
事實上,在如上的代碼中,我們可以不通過反序列化的操作,代碼可以簡化為:
#!/usr/bin/env python #coding:utf-8 import json import requests r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安') print r.json(),u'數據類型為:',type(r.json())
見輸出的內容:
C:\Python27\python.exe D:/git/Python/doc/index.py {u'status': 1000, u'data': {u'city': u'\u897f\u5b89', u'yesterday': {u'fx': u'\u5317\u98ce', u'type': u'\u9634', u'high': u'\u9ad8\u6e29 7\u2103', u'low': u'\u4f4e\u6e29 -1\u2103', u'date': u'21\u65e5\u661f\u671f\u4e09', u'fl': u'\u5fae\u98ce'}, u'forecast': [{u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 10\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'22\u65e5\u661f\u671f\u56db', u'type': u'\u6674', u'low': u'\u4f4e\u6e29 -2\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 8\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'23\u65e5\u661f\u671f\u4e94', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 0\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 7\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'24\u65e5\u661f\u671f\u516d', u'type': u'\u9634', u'low': u'\u4f4e\u6e29 0\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 1\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'25\u65e5\u661f\u671f\u5929', u'type': u'\u96e8\u5939\u96ea', u'low': u'\u4f4e\u6e29 -1\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 5\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'26\u65e5\u661f\u671f\u4e00', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 1\u2103'}], u'ganmao': u'\u663c\u591c\u6e29\u5dee\u8f83\u5927\uff0c\u8f83\u6613\u53d1\u751f\u611f\u5192\uff0c\u8bf7\u9002\u5f53\u589e\u51cf\u8863\u670d\u3002\u4f53\u8d28\u8f83\u5f31\u7684\u670b\u53cb\u8bf7\u6ce8\u610f\u9632\u62a4\u3002', u'wendu': u'3', u'aqi': u'87'}, u'desc': u'OK'} 數據類型為: <type 'dict'> Process finished with exit code 0
在實際的工作中,序列化或者反序列化的可能是一個文件的形式,不可能像如上寫的那樣簡單的,下來就來實現這部分,把文件內容
進行序列化和反序列化,先來看序列化的代碼:
#!/usr/bin/env python #coding:utf-8 import json list1=['selenium','appium','android','ios','uiautomator'] #把list1先序列化,再寫入到一個文件中 print json.dump(list1,open('c:/log.log','w')) print u'文件內容為:' r=open('c:/log.log','r+') print r.read()
見輸出的內容:
C:\Python27\python.exe D:/git/Python/doc/index.py None 文件內容為: ["selenium", "appium", "android", "ios", "uiautomator"] Process finished with exit code 0
下面我們來反序列化,也就是先讀取文件里面的內容,再進行反序列化,見實現的代碼:
#!/usr/bin/env python #coding:utf-8 import json list1=['selenium','appium','android','ios','uiautomator'] #把list1先序列化,再寫入到一個文件中 print json.dump(list1,open('c:/log.log','w')) print u'文件內容為:' r=open('c:/log.log','r+') print r.read() #先讀取文件內容,再進行反序列化 res=json.load(open('c:/log.log','r+')) print res,u'數據類型:',type(res)
見輸出的內容:
C:\Python27\python.exe D:/git/Python/doc/index.py None 文件內容為: ["selenium", "appium", "android", "ios", "uiautomator"] [u'selenium', u'appium', u'android', u'ios', u'uiautomator'] 數據類型: <type 'list'> Process finished with exit code 0
下來來看pickle庫,它提供的方法為:
#!/usr/bin/env python #coding:utf-8 import pickle print pickle.__all__
C:\Python27\python.exe D:/git/Python/doc/index.py ['PickleError', 'PicklingError', 'UnpicklingError', 'Pickler', 'Unpickler', 'dump', 'dumps', 'load', 'loads', 'APPEND', 'APPENDS', 'BINFLOAT', 'BINGET', 'BININT', 'BININT1', 'BININT2', 'BINPERSID', 'BINPUT', 'BINSTRING', 'BINUNICODE', 'BUILD', 'DICT', 'DUP', 'EMPTY_DICT', 'EMPTY_LIST', 'EMPTY_TUPLE', 'EXT1', 'EXT2', 'EXT4', 'FALSE', 'FLOAT', 'GET', 'GLOBAL', 'HIGHEST_PROTOCOL', 'INST', 'INT', 'LIST', 'LONG', 'LONG1', 'LONG4', 'LONG_BINGET', 'LONG_BINPUT', 'MARK', 'NEWFALSE', 'NEWOBJ', 'NEWTRUE', 'NONE', 'OBJ', 'PERSID', 'POP', 'POP_MARK', 'PROTO', 'PUT', 'REDUCE', 'SETITEM', 'SETITEMS', 'SHORT_BINSTRING', 'STOP', 'STRING', 'TRUE', 'TUPLE', 'TUPLE1', 'TUPLE2', 'TUPLE3', 'UNICODE'] Process finished with exit code 0
這里我們只關注pickle庫的dump(),dumps(),load(),loads()方法,先來看序列化的代碼:
import pickle dic={'name':'無涯','age':22,'address':'西安'} str1=pickle.dumps(dic) print str1,type(str1)
見輸出的內容:
C:\Python27\python.exe D:/git/Python/doc/index.py (dp0 S'age' p1 I22 sS'name' p2 S'\xe6\x97\xa0\xe6\xb6\xaf' p3 sS'address' p4 S'\xe8\xa5\xbf\xe5\xae\x89' p5 s. <type 'str'>
輸出的內容基本看不懂,但是可以看到數據格式是字符串,這是ASCII格式的數據,默認是ASCII格式保存對象,
在進行序列化的使用,設置為True就是二進制保存對象,見實現的代碼和輸出內容:
#!/usr/bin/env python #coding:utf-8 import pickle dic={'name':'無涯','age':22,'address':'西安'} str1=pickle.dumps(dic,True) print str1,type(str1)
見輸出的二進制的數據:
C:\Python27\python.exe D:/git/Python/doc/index.py }q (UageqKUnameqU無涯qUaddressqU西安qu. <type 'str'>
下面通過loads()方法來進行反序列化,見實現的代碼:
#!/usr/bin/env python #coding:utf-8 import pickle dic={'name':u'無涯','age':22,'address':u'西安'} #序列化 str1=pickle.dumps(dic,True) print str1,type(str1) #反序列化 dict1=pickle.loads(str1) print dict1,type(dict1)
見輸出的內容:
C:\Python27\python.exe D:/git/Python/doc/index.py }q (UageqKUnameqX 無涯qUaddressqX 西安qu. <type 'str'> {'age': 22, 'name': u'\u65e0\u6daf', 'address': u'\u897f\u5b89'} <type 'dict'>
下來我們通過對文件的形式來進行序列化和反序列化,見實現的代碼:
#!/usr/bin/env python #coding:utf-8 import pickle dic={'name':u'無涯','age':22,'address':u'西安'} #先序列化,然后寫入到文件中 pickle.dump(dic,open('c:/log.log','w'),True) print u'文件內容為:' print open('c:/log.log').read() #先讀取文件,再反序列化 d=pickle.load(open('c:/log.log','r+')) print u'反序列化后的數據與數據類型:',d,type(d)
見輸出的內容:
C:\Python27\python.exe D:/git/Python/doc/index.py 文件內容為: }q (UageqKUnameqX 無涯qUaddressqX 西安qu. 反序列化后的數據與數據類型: {'age': 22, 'name': u'\u65e0\u6daf', 'address': u'\u897f\u5b89'} <type 'dict'> Process finished with exit code 0
如您對我寫的內容感興趣,可掃描關注本人的微信公眾,祝安!