python 持久化的存储数据:
python 程序运行中得到了一些字符串,列表,字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。python 模块大全中 pickle 模块就排上用场了, 他可以将对象转换为一种可以传输或存储的格式。
pickle 模块将任意一个 python 对象转换成一系统字节的这个操作过程叫做串行化对象。
python 的 pickle 模块实现了 python 的所有数据序列和反序列化。基本上功能使用和 JSON 模块没有太大区别,方法也同样是 dumps/dump 和 loads/load。cPickle 是 pickle 模块的 C 语言编译版本相对速度更快。
与 JSON 不同的是 pickle 不是用于多种语言间的数据传输,它仅作为 python 对象的持久化或者 python 程序间进行互相传输对象的方法,因此它支持了 python 所有的数据类型。
- import pickle
- data2 = [1,2,3,4]
- det_str = pickle.dumps(data2)
- print(det_str)
- #output: 输出为二进制格式
- b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04e.'
- #将数据序列化后存储到文件中
- f = open('test.txt','wb') #pickle只能以二进制格式存储数据到文件
- data = {'k1':'python','k2':'java'}
- f.write(pickle.dumps(data)) #dumps序列化源数据后写入文件
- f.close()
- #反序列化读取源数据
- import pickle
- f = open('test.txt','rb')
- da = pickle.loads(f.read()) #使用loads反序列化
- print(da)
dumps 和 dump,load 和 loads 的区别:
dumps 是将对象序列化
dump 是将对象序列化并保存到文件中
loads 将序列化字符串反序列化
load 将序列化字符串从文件读取并反序列化
- import pickle
- data1 = [1,'a',2,'b',3,'c']
- pi = pickle.dumps(data1) #序列化对象
- print(pi)
- print(pickle.loads(pi)) #反序列化对象
- f = open('test1.txt','wb')
- data2 = ['py','th','on',123]
- pickle.dump(data2,f) #序列化对象到文件
- f = open('test1.txt','rb')
- red = pickle.load(f) #从文件中反序列化对象
- print(red)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于 ECMAScript 的一个子集。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯 (包括 C、C++、Java、JavaScript、Perl、Python 等)。这些特性使 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成 (一般用于提升网络传输速率)。
- data1 = [1,'a',2,'b',3,'c']
- pi = json.dumps(data1)
- print(pi)
- print(json.loads(pi))
- f = open('test1.txt','w') #与pickle不同的是存储时不使用二进制存储,而使用str
- data2 = ['py','th','on',123]
- json.dump(data2,f)
- f = open('test1.txt','r')
- red = json.load(f)
- print(red)
1、JSON 只能处理基本数据类型。pickle 能处理所有 Python 的数据类型。
2、JSON 用于各种语言之间的字符转换。pickle 用于 Python 程序对象的持久化或者 Python 程序间对象网络传输,但不同版本的 Python 序列化可能还有差异。
来源: http://www.bubuko.com/infodetail-2428383.html