python json、pickle模块

python提供了json和pickle在内的多种序列化库。
作为标准库,json和pickle具有极高的相似性,son模块和picle模块都有 dumps、dump、loads、load四种方法,而且用法一样。不过json模块序列化出来的是通用格式,其它编程语言都认识,就是普通的字符串,而pickle模块序列化出来的只有python可以认识,其他编程语言不认识的,表现为乱码。
但相对的piclle具有将函数和对象序列化的能力,这点是json无法做到了。另外使用pickle库时与文件相关的操作需以二进制的方式进行。
首先介绍两个库都具有的四个方法。

import json,pickle

"""此段为dumps"""
child = {'name':'xiaoming','age':12}
f = open('JSON','w')
temp = json.dumps(child)
f.write(temp)
f.close()

f = open('PICKLE','wb')
temp = pickle.dumps(child)
f.write(temp)
f.close()

"""此段为dump"""
child = {'name':'xiaoming','age':12}
f = open('JSON','w')
json.dump(child,f)
f.close()

f = open('PICKLE','wb')
pickle.dump(child,f)
f.close()

"""此段为loads"""
f = open('JSON','r')
temp = f.read()
child = json.loads(temp)
print(child)
print(type(child))
f.close()

f = open('PICKLE','rb')
child = f.read()
child = pickle.loads(child)
print(child)
print(type(child))
f.close()

"""此段为load"""
f = open('JSON','r')
child = json.load(f)
print(child)
print(type(child))
f.close()

f = open('PICKLE','rb')
child = pickle.load(f)
print(child)
print(type(child))
f.close()

此外pickle库提供了将函数及对象序列化的功能。但在调用反序列化得到的函数或对象时,需再次声明此函数或对象,因其反序列后的得到的仅仅是指向函数或对象的指针,而非整个函数。

#此处为main.py
#filename:main.py
import pickle

def say_hello():
    print("hello")

f = open("PICKLE",'wb')
pickle.dump(say_hello,f)
f.close()

f = open("PICKLE",'rb')
ret = pickle.load(f)
ret()
#此处为other.py
#filename:other.py
import pickle
f = open("PICKLE",'rb')
ret = pickle.load(f)
ret()
#若仅这样执行会报错
AttributeError: Can't get attribute 'say_hello' on <module '__main__' from 'E:/pycode/json_picle/other.py'>
#故需在其前边添加函数say_hello()
#filename:other.py
import pickle

def say_hello():
    print("hello")

f = open("PICKLE",'rb')
ret = pickle.load(f)
ret()

猜你喜欢

转载自blog.csdn.net/qq_41377679/article/details/81159992