序列化:把变量从内存中变为可储存或者可传输的过程叫做序列化,序列化之后就可将已序列化过的数据写入磁盘,或者通过网络传输到别的机器上。
python中使用pickle
进行序列化
1.dumps()
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
dump()
函数内置了很多参数,这些参数的用法一一介绍。
(1)dump(obj)
obj参数是必填项,就是需要被序列化的参数。
例如:
>>> s=[1,'zaq',['python','learing'],{'time':30,'asf':'y'}]
>>> print(s)
[1, 'zaq', ['python', 'learing'], {'time': 30, 'asf': 'y'}]
>>> import json
>>> print(pickle.dumps(s))
b'\x80\x03]q\x00(K\x01X\x03\x00\x00\x00zaqq\x01]q\x02(X\x06\x00\x00\x00pythonq\x03X\x07\x00\x00\x00learingq\x04e}q\x05(X\x04\x00\x00\x00timeq\x06K\x1eX\x03\x00\x00\x00asfq\x07X\x01\x00\x00\x00yq\x08ue.'
这里就是将原来的列表s,变成了一个可用于存储和传输的bytes
。
(2)dump(obj,f)
后将序列后的s放到文件中去(用于存储):
f=open('dump.txt','wb')#因为序列化后的s是一个字节,所以要用wb的方式写入
pickle.dump(s,f)
f.close()#使用完文件一定要让它关上
```
打开dump文件:
```
€]q (KX zaqq]q(X pythonqX learingqe}q(X timeqKX asfqX yque.€]q (KX zaqq]q(X pythonqX learingqe}q(X timeqKX asfqX yque.€]q (KX zaqq]q(X pythonqX learingqe}q(X timeqKX asfqX yque.€]q (KX zaqq]q(X pythonqX learingqe}q(X timeqKX asfqX yque.
```
显示的的是python 保存的对象内部信息...反正看不懂
## json-python
为了更加方便的传输和保存,一般数据都是用json 表示。因为json 传输的是一个字符串,更快更方便。
对于json和python之间的数据对象对比如下:
- python-json

- json-python

例如:
import json
s=[1,’zaq’,[‘python’,’learing’],{‘time’:(1,30),’asf’:’y’}]
print(json.dumps(s))
[1, “zaq”, [“python”, “learing”], {“time”: [1, 30], “asf”: “y”}]
print(type(json.dumps(s)))
其中元组就变成了列表,但是序列化之后的s就是字符串
将json转化为python:`json,loads()`
语法:`json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])`
例子:
import json
txt_json=’[“a”,1,”s”,2]’
json.loads(txt_json)
[‘a’, 1, ‘s’, 2]
(3)dump(obj, fp, *, skipkeys=False)
skipkeys
可以设置被序列化的字典中的key 不用是str
类型。
例如:
>>> s={'name':"zaq",'time':30,('who',30):'y'}
>>> json.dumps(s) #不使用skipkeys参数,就会报错
Traceback (most recent call last):
File "<input>", line 1, in <module>
>>> json.dumps(s,skipkeys=True)
'{"time": 30, "name": "zaq"}'
(4)dump(obj,indent=None)
indent
用来加缩进值
>>> d1=json.dumps(s,skipkeys=True,indent=4)
>>> print(d1)
{
"time": 30,
"name": "zaq"
}
但是看到('who',30):'y'
这一部分没有输出,估计是skipkeys=True
的原因。
(5)dump(obj, sort_keys=False)
sore_keys
是保证字典输出按照原有顺序来的依靠。
>>> s={'time': 30, 'who': 'y', 'name': 'zaq'}
>>> d1=json.dumps(s,sort_keys=True)
>>> print(d1)
{"name": "zaq", "time": 30, "who": "y"}
2.反序列化load()
之前往文件里面写了一点东西,现在把它拿出来
>>> f=open('dump.txt','rb')
>>> d=pickle.load(f)
>>> f.close()
>>> d
[1, 'zaq', ['python', 'learing'], {'time': 30, 'asf': 'y'}]