当前位置:   article > 正文

了解python之(反)序列化_python 反序列化成类

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序列化

  1. import pickle
  2. account_info={
  3. '12666666':['lucky','666','666'],
  4. '13666666':['xianchao','166','166']
  5. }
  6. #wb: 以二进制格式打开一个文件只用于写入。如果该文件已经存在则打开文件,并从文件的开头开始编辑,即原有的内容会被删除,如果该文件不存在,创建新文件。一般用于非文本文件,如图片,视频等
  7. f=open('account.pkl', 'wb') #
  8. pickle.dump(account_info,f) #将account字典序列化后存到 以二进制模式打开的文件account.pkl中
  9. f.close()
  10. ##输出结果
  11. account.pkl内容:
  12. �}q (X 12666666q]q(X luckyqX 666qheX 13666666q]q(X xianchaoqX 166qheu.

例2:pickle反序列化

  1. import pickle
  2. f=open('account.pkl', 'rb')
  3. acc1=pickle.load(f)
  4. print(acc1)
  5. # rb:以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认的模式,一般用于非文本文件,如图片,视频等
  6. ##输出结果
  7. {'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():

  1. import json
  2. name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
  3. jsObj = json.dumps(name_emb)
  4. print(name_emb)
  5. print(jsObj)
  6. print(type(name_emb))
  7. print(type(jsObj))
  8. ##
  9. {'a': '1111', 'c': '3333', 'b': '2222', 'd': '4444'}
  10. {"a": "1111", "c": "3333", "b": "2222", "d": "4444"}
  11. <type 'dict'>
  12. <type 'str'>

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

  1. big_general@DESKTOP-E7OCTAC:~/python$ cat test_dumps3.py
  2. import json
  3. name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
  4. emb_filename = ('/home/cqh/faceData/emb_json.json')
  5. # jsObj = json.dumps(name_emb) # 此处注释 dumps()转换成字符串,发现最后运行错误
  6. with open(emb_filename, "w") as f:
  7. f.write(name_emb)
  8. f.close()
  9. big_general@DESKTOP-E7OCTAC:~/python$
  10. big_general@DESKTOP-E7OCTAC:~/python$
  11. big_general@DESKTOP-E7OCTAC:~/python$ python test_dumps3.py
  12. Traceback (most recent call last):
  13. File "test_dumps3.py", line 8, in <module>
  14. with open(emb_filename, "w") as f:
  15. IOError: [Errno 2] No such file or directory: '/home/cqh/faceData/emb_json.json'

 

json.loads():

  1. import json
  2. name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
  3. jsDumps = json.dumps(name_emb)
  4. jsLoads = json.loads(jsDumps)
  5. print(name_emb)
  6. print(jsDumps)
  7. print(jsLoads)
  8. print(type(name_emb))
  9. print(type(jsDumps))
  10. print(type(jsLoads))
  11. ##
  12. {'a': '1111', 'c': '3333', 'b': '2222', 'd': '4444'}
  13. {"a": "1111", "c": "3333", "b": "2222", "d": "4444"}
  14. {u'a': u'1111', u'c': u'3333', u'b': u'2222', u'd': u'4444'} ##'a'变成了u'a'是因为发生了类型转换,str会转换成unicode
  15. <type 'dict'>
  16. <type 'str'>
  17. <type 'dict'>

 

json.dump():

  1. big_general@DESKTOP-E7OCTAC:~/python$ cat test_dump.py
  2. import json
  3. name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
  4. emb_filename = ('/home/big_general/python/test.json')
  5. json.dump(name_emb, open(emb_filename, "w")) ##注意,此处使用json.dump()时候,需要一个类文件指针,否则会报错。
  6. big_general@DESKTOP-E7OCTAC:~/python$
  7. big_general@DESKTOP-E7OCTAC:~/python$ ls
  8. test_dump.py
  9. big_general@DESKTOP-E7OCTAC:~/python$ python test_dump.py
  10. big_general@DESKTOP-E7OCTAC:~/python$
  11. big_general@DESKTOP-E7OCTAC:~/python$ ls
  12. test.json test_dump.py
  13. big_general@DESKTOP-E7OCTAC:~/python$
  14. big_general@DESKTOP-E7OCTAC:~/python$ cat test.json
  15. {"a": "1111", "c": "3333", "b": "2222", "d": "4444"}
  1. big_general@DESKTOP-E7OCTAC:~/python$ cat test_dumps.py
  2. import json
  3. name_emb = {'a':'1111','b':'2222','c':'3333','d':'4444'}
  4. emb_filename = ('/home/big_general/python/test2.json')
  5. jsObj = json.dumps(name_emb) ##使用了json.dumps,直接将字典转换为字符串
  6. with open(emb_filename, "w") as f:
  7. f.write(jsObj)
  8. f.close()
  9. big_general@DESKTOP-E7OCTAC:~/python$ python test_dumps.py
  10. big_general@DESKTOP-E7OCTAC:~/python$ cat test2.json
  11. {"a": "1111", "c": "3333", "b": "2222", "d": "4444"}

 

json.load():

  1. big_general@DESKTOP-E7OCTAC:~/python$ cat test_load.py
  2. import json
  3. emb_filename = ('/home/big_general/python/test2.json')
  4. jsObj = json.load(open(emb_filename)) ##此处使用json.load(),括号内也使用了一个类文件指针
  5. print(jsObj)
  6. print(type(jsObj))
  7. for key in jsObj.keys():
  8. print('key: %s value: %s' % (key,jsObj.get(key)))
  9. big_general@DESKTOP-E7OCTAC:~/python$
  10. big_general@DESKTOP-E7OCTAC:~/python$ python test_load.py
  11. {u'a': u'1111', u'c': u'3333', u'b': u'2222', u'd': u'4444'}
  12. <type 'dict'>
  13. key: a value: 1111
  14. key: c value: 3333
  15. key: b value: 2222
  16. key: d value: 4444

 

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

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

python dumps和dump的区别

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/426148
推荐阅读
相关标签
  

闽ICP备14008679号