Python 常用模块- json/pickle序列化/反序列化

Python 常用模块- json/pickle序列化/反序列化

http://www.cnblogs.com/alex3714/articles/5161349.html

1.1.      json/pickle序列化/反序列化

https://www.cnblogs.com/tkqasn/p/6005025.html

1.1.1.什么是序列化?

https://baike.baidu.com/item/%E5%BA%8F%E5%88%97%E5%8C%96/2890184?fr=aladdin

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

目的:

例如 字典转换成字符串 用于传输和存储(序列化),字符串转成字典 用于调用和识别(反序列化)。

1、以某种存储形式使自定义对象持久化

2、将对象从一个地方传递到另一个地方。

3、使程序更具维护性。

1.1.2.区别和相同:

pickle是Python独有的,json是所有语言都支持的。

JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

 

python的pickle模块实现了python的所有数据序列和反序列化。基本上功能使用和JSON模块没有太大区别,方法也同样是dumps/dump和loads/load。cPickle是pickle模块的C语言编译版本相对速度更快。

与JSON不同的是pickle不是用于多种语言间的数据传输,它仅作为python对象的持久化或者python程序间进行互相传输对象的方法,因此它支持了python所有的数据类型。

pickle反序列化后的对象与原对象是等值的副本对象,类似与deepcopy。

json和pickle模块,两个都是用于序列化的模块

• json模块,用于字符串与python数据类型之间的转换,字典,元祖,列表等。

• pickle模块,用于python特有类型与python数据类型之间的转换,几乎所有的数据类型。

 

例如Pickle 可以把函数序列化,而json不能。

 

两个模块,都提供了dumps,dump,loads,load 4个功能

1.1.3.pickle

1.1.3.1.   序列化

1.1.3.1.1. dumps 将对象序列化

import pickle
f = open('user_acc.txt','wb')

info = {
    'wangxu': '123',
    'jack': '456'
}

f.write(pickle.dumps(info)) 
# d = pickle.dumps(info)
# f.write(d)
f.close()

dumps
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day5/模块/序列化.py

进程已结束,退出代码0

 

1.1.3.1.2.dump将对象序列化并保存到文件
import pickle
f = open('user_acc.txt','wb')

info = {
    'wangxu': '123',
    'jack': '456'
}

pickle.dump(info,f)
f.close()

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day5/模块/序列化.py

进程已结束,退出代码0

1.1.3.2.   反序列化

1.1.3.2.1.loads将序列化字符串反序列化
import pickle
f = open('user_acc.txt','rb')
a = pickle.load(f)
print(a)
print(type(a))

for k in a:
    print(k)


for k,v in a.items():
    print(k+":"+v)

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day5/cc/序列化个人.py

{'wangxu': '123', 'jack': '456'}

<class 'dict'>

wangxu

jack

wangxu:123

jack:456

 

进程已结束,退出代码0

1.1.3.3.   user_acc.txt 是乱码的you


}q(XwxqX


1111qX


jackq


X


2222q


 

 

1.1.4. json

 

1.1.4.1.   序列化

#import pickle
import json
f = open('user_acc.txt','w')

info = {
    "wx":'1111',
    'jack':'2222'
}

f.write(json.dumps(info))

f.close()

1.1.4.2.  反序列化

import json
f = open('user_acc.txt','r')

data = json.loads(f.read())

for i in data:
    print(i)

print(data)
print(type(data))

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/admin/PycharmProjects/s18/day5/模块/序列化个人.py

wx

jack

{'wx': '1111', 'jack': '2222'}

<class 'dict'>

 

进程已结束,退出代码0

1.1.4.3.   user_acc.txt 不是乱码呦

{"wx": "1111", "jack": "2222"}

1.1.5. dumps和dump区别

#dumps 执行序列化
#dump  执行序列化并写到文件中(参数跟文件名)。相当于dumps两步合一

 

import pickle,json
f = open('user_acc.txt','w')

info = {
    'wangxu': '123',
    'jack': '456'
}

#f.write(json.dumps(info))    #dumps 执行序列化
json.dump(info,f)             #dump  执行序列化并写到文件中(参数跟文件名)。
f.close()

 

1.1.6. loads和load区别

#loads 执行发序列化

#load 打开文件并执行反序列化(参数跟文件名)。相当于loads二步合一

 

import pickle,json
f = open('user_acc.txt','r')

#c = json.loads(f.read())

c = json.load(f)

print(c)

for i in c:
    print(i)

 

 

 

posted on 2018-05-10 17:32  光阴8023  阅读(189)  评论(0编辑  收藏  举报