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"}
如果直接将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()区别