本文共 3021 字,大约阅读时间需要 10 分钟。
这一节看看在Python中如何序列化和反序列化。简单的说,序列化就是把内存中保存的数据类型转换为可以存储或者传输的过程,比如说我把一个字典转换为一个字符串这样就可以方便传递或者保存了;反序列化则是倒过来,把字符串转换为对应的数据类型。
Python里面常用的有两种方式。
JSON
Pickle
首先来看看JSON,
例1 比如说我有一个字典如下所示:
1 2 3 4 5 | >>> import json dic = { "k1" : "v1" } print (dic, type (dic)) - - - - - - - - - - - - - - - - - - - - - - - - - { 'k1' : 'v1' } < class 'dict' > |
通过 json.dumps就能转换为字符串了
1 2 3 4 | >>> result = json.dumps(dic) print (result, type (result)) - - - - - - - - - - - - - - - - - - - - - - - - - - { "k1" : "v1" } < class 'str' > |
倒过来,如何把字符串转换成对应的结构呢?
可以用json.loads ; 前面学函数的时候学了eval,他也可以的
1 2 3 4 5 6 7 8 9 | >>> 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格式的字符串,然后把他转换成字典输出
1 2 3 4 5 6 7 8 9 10 | >>> 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. 序列化,反序列化列表也是可以。反序列化的时候,需要外面用单引号,里面用双引号
1 2 3 4 5 6 7 8 | >>> 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多做了一步文件的操作
1 2 3 4 | 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进制的
1 2 3 4 5 6 7 8 | 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进制格式
1 2 | li = [ 11 , 22 , 33 ] pickle.dump(li, open ( 'db' , 'wb' )) |