了解python之(反)序列化

了解python之(反)序列化

 

pickle序列化和反序列化

pickle只能在python间进行内存共享;
序列化语法:
pickle.dump(obj,file,[,protocol])

obj--序列化对象
file--把序列化的对象obj保存到文件中,file必须有write()接口,file可以是以w模式打开的文件,也可以是任何可以实现write()接口的对象。
protocol--序列化模式,默认是0,(ASCII协议,表示以文本的形式进行序列化)。protocol还可以是1和2,(1和2表示以二进制的形式进行序列化,其中1是老式的二进制协议,2是新式的二进制协议)
反序列化的语法:
pickle.load(file)

反序列化对象,将文件中的数据解析成一个python对象,file中有read()和readline()接口。

 

例1:pickle序列化

import pickle
account_info={
    '12666666':['lucky','666','666'],
    '13666666':['xianchao','166','166']
}

#wb: 以二进制格式打开一个文件只用于写入。如果该文件已经存在则打开文件,并从文件的开头开始编辑,即原有的内容会被删除,如果该文件不存在,创建新文件。一般用于非文本文件,如图片,视频等

f=open('account.pkl', 'wb') #
pickle.dump(account_info,f) #将account字典序列化后存到 以二进制模式打开的文件account.pkl中
f.close()

##输出结果
account.pkl内容:
�}q (X   12666666q]q(X   luckyqX   666qheX   13666666q]q(X   xianchaoqX   166qheu.


例2:pickle反序列化

import pickle
f=open('account.pkl', 'rb')
acc1=pickle.load(f)
print(acc1)

# rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认的模式,一般用于非文本文件,如图片,视频等

##输出结果
{'12666666': ['lucky', '666', '666'], '13666666': ['xianchao', '166', '166']}

 

pickle序列化和反序列化只能用于python,不同版本的python可能不兼容,因此pickle用于保存不重要的数据,也就是不能成功反序列化也没影响的数据。

 

json序列化和反序列化

pickle只能在python平台使用,json能在所有平台使用,优点是各个平台数据都可以交换。python中的类不能用json序列化,只能序列化字典,元组,列表等。

1)json.dumps()函数是将一个python数据类型列表进行json格式编码(可以这样理解,json.dumps()函数用于将字典转换成字符串)

2)json.loads()函数是将json格式数据转换成字典(可以这么理解,json.loads()函数将字符串转换成字典)

3)  json.dump() 与 json.load()也是类似功能,只是需要与文件操作结合起来

 

Note: 涉及到文件打开的模式,具体参考:  了解python文件处理

 

json.dumps():

import json 
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}  
 
jsObj = json.dumps(name_emb)   
 
print(name_emb) 
print(jsObj) 
 
print(type(name_emb)) 
print(type(jsObj))

##
{'a': '1111', 'c': '3333', 'b': '2222', 'd': '4444'}
{"a": "1111", "c": "3333", "b": "2222", "d": "4444"}

如果直接将dict类型的数据写入json文件中会发生报错,因此在将数据写入时需要用到该函数。

big_general@DESKTOP-E7OCTAC:~/python$ cat test_dumps3.py
import json
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}

emb_filename = ('/home/cqh/faceData/emb_json.json')

# jsObj = json.dumps(name_emb)         # 此处注释 dumps()转换成字符串,发现最后运行错误

with open(emb_filename, "w") as f:
  f.write(name_emb)
  f.close()
big_general@DESKTOP-E7OCTAC:~/python$
big_general@DESKTOP-E7OCTAC:~/python$
big_general@DESKTOP-E7OCTAC:~/python$ python test_dumps3.py
Traceback (most recent call last):
  File "test_dumps3.py", line 8, in 
    with open(emb_filename, "w") as f:
IOError: [Errno 2] No such file or directory: '/home/cqh/faceData/emb_json.json'

 

json.loads():

import json   
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}  
 
jsDumps = json.dumps(name_emb)   
 
jsLoads = json.loads(jsDumps)  
 
print(name_emb) 
print(jsDumps) 
print(jsLoads) 
 
print(type(name_emb)) 
print(type(jsDumps)) 
print(type(jsLoads))    


##
{'a': '1111', 'c': '3333', 'b': '2222', 'd': '4444'}
{"a": "1111", "c": "3333", "b": "2222", "d": "4444"}
{u'a': u'1111', u'c': u'3333', u'b': u'2222', u'd': u'4444'} ##'a'变成了u'a'是因为发生了类型转换,str会转换成unicode


 

json.dump():

big_general@DESKTOP-E7OCTAC:~/python$ cat test_dump.py
import json
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
emb_filename = ('/home/big_general/python/test.json')
json.dump(name_emb, open(emb_filename, "w")) ##注意,此处使用json.dump()时候,需要一个类文件指针,否则会报错。
big_general@DESKTOP-E7OCTAC:~/python$
big_general@DESKTOP-E7OCTAC:~/python$ ls
test_dump.py
big_general@DESKTOP-E7OCTAC:~/python$ python test_dump.py
big_general@DESKTOP-E7OCTAC:~/python$
big_general@DESKTOP-E7OCTAC:~/python$ ls
test.json  test_dump.py
big_general@DESKTOP-E7OCTAC:~/python$
big_general@DESKTOP-E7OCTAC:~/python$ cat test.json
{"a": "1111", "c": "3333", "b": "2222", "d": "4444"}
big_general@DESKTOP-E7OCTAC:~/python$ cat test_dumps.py
import json
name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
emb_filename = ('/home/big_general/python/test2.json')

jsObj = json.dumps(name_emb)    ##使用了json.dumps,直接将字典转换为字符串
with open(emb_filename, "w") as f:
  f.write(jsObj)
  f.close()

big_general@DESKTOP-E7OCTAC:~/python$ python test_dumps.py
big_general@DESKTOP-E7OCTAC:~/python$ cat test2.json
{"a": "1111", "c": "3333", "b": "2222", "d": "4444"}

 

json.load():

big_general@DESKTOP-E7OCTAC:~/python$ cat test_load.py
import json
emb_filename = ('/home/big_general/python/test2.json')

jsObj = json.load(open(emb_filename)) ##此处使用json.load(),括号内也使用了一个类文件指针

print(jsObj)
print(type(jsObj))

for key in jsObj.keys():
  print('key: %s  value: %s' % (key,jsObj.get(key)))
big_general@DESKTOP-E7OCTAC:~/python$
big_general@DESKTOP-E7OCTAC:~/python$ python test_load.py
{u'a': u'1111', u'c': u'3333', u'b': u'2222', u'd': u'4444'}

key: a  value: 1111
key: c  value: 3333
key: b  value: 2222
key: d  value: 4444

 

参考: 文中的样例都经过真实环境的测试。

Python Json模块中dumps、loads、dump、load函数介绍

python dumps和dump的区别

python的json.dumps() json.dump()区别

 

你可能感兴趣的:(python学习)