赞
踩
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用于保存不重要的数据,也就是不能成功反序列化也没影响的数据。
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"}
- <type 'dict'>
- <type 'str'>

如果直接将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 <module>
- 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
- <type 'dict'>
- <type 'str'>
- <type 'dict'>

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'}
- <type 'dict'>
- key: a value: 1111
- key: c value: 3333
- key: b value: 2222
- key: d value: 4444

参考: 文中的样例都经过真实环境的测试。
Python Json模块中dumps、loads、dump、load函数介绍
python的json.dumps() json.dump()区别
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。