一、简述
我们在写入文件中的数据,只能是字符串,但是如果要想把内存的数据对象存到硬盘上去怎么办呐?下面就来说说序列化:json & pickle
二、json序列化
1、dumps序列化和loads反序列化
dumps()序列化
import ?json ??#导入json模块 info = { ???‘name‘:"seven", ???"age":32} with open("test.txt","w") as f: ?#以普通模式写入 ???data = json.dumps(info) #把内存对象转为字符串 ???f.write(data) ??#写到文件中 #text.txt文件中的内容{"name": "seven", "age": 32}
loads()反序列化
import json with open("test.txt","r") as f: ?#以普通模式读 ???data = json.loads(f.read()) ??#用loads反序列化 print(data.get("age")) #输出32
2、dump序列化和load反序列化
dump()序列化
import ?json info = { ???‘name‘:"seven", ???"age":32} with open("test.txt","w") as f: ??#文件以写的方式打开 ???json.dump(info,f) ???#第1个参数是内存的数据对象 ,第2个参数是文件句柄 #text.txt文件中的内容{"name": "seven", "age": 32}
load()反序列化
import json with open("test.txt","r") as f: ??#以读的方式打开文件 ???data = json.load(f) ?#输入文件对象 print(data["age"]) #输出32
3、序列化函数
import ?json def sayhi(name): ?#函数 ???print("name:",name) info = { ???‘name‘:"seven", ???"age":32, ???"func":sayhi ???#引用sayhi函数名} with open("test.txt","w") as f: ???json.dump(info,f) ??#序列化info数据对象 #输出 File "D:\Python\Python35\lib\json\encoder.py", line 403, in _iterencode_dict ???yield from chunks ?File "D:\Python\Python35\lib\json\encoder.py", line 436, in _iterencode ???o = _default(o) ?File "D:\Python\Python35\lib\json\encoder.py", line 179, in default ???raise TypeError(repr(o) + " is not JSON serializable")TypeError: <function sayhi at 0x00000000006DD510> is not JSON serializable ?#不支持json序列化
小结:
- dumps和loads是成对使用的,dump和load是成对使用的。
- dumps和loads由于序列化的是内容,所以后面要加s,但是dump和load序列化的内容是对象,所以单数。
- json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。
- json是所有语言通用的,所有语言都支持json,如果我们需要python跟其他语言进行数据交互,那么就用json格式。
二、pickle序列化
1、dumps序列化和loads反序列化
dumps()序列化
import pickle info = { ???‘name‘:"seven", ???"age":32,} with open("test.txt","wb") as f: ??#以二进制的形式写入 ???data = pickle.dumps(info) ??#序列化成字符串 ???f.write(data) ??#写入test.txt 文件中 #输出到test.txt文件中的内容?}q (X ??ageqKX ??nameqX ??sevenqu.
loads()反序列化
import pickle with open("test.txt","rb") as f: #以二进制的模式读 ???data = pickle.loads(f.read()) ??#反序列化操作 print(data.get("age")) #输出32
2、dump序列化和load反序列化
dump()序列化
import pickle info = { ???‘name‘:"seven", ???"age":32,} with open("test.txt","wb") as f: ???pickle.dump(info,f) ?#序列化 #输出?}q (X ??ageqKX ??nameqX ??sevenqu.
load()反序列化
import pickle with open("test.txt","rb") as f: ???data = pickle.load(f) ?#反序列化成内存对象 print(data.get("age")) #输出32
从上面的结果观察,json和pickle好像也没什么区别?但是别忘了,我们说,json只能序列化简单的数据类型,而pickle可以序列化python中所有的数据类型,包括函数、类等,下面我们就来看看,如何序列化函数的。还有就是,pickle序列化的是字节,而json序列化的是字符,这个要注意一下。
3、序列化函数
①序列化
import pickle def sayhi(name): ??#函数 ???print("hello:",name) info = { ???‘name‘:"seven", ???"age":32, ???"func":sayhi ???#"func"对应的值sayhi,是函数名} with open("test.txt","wb") as f: ???data = pickle.dumps(info) ???f.write(data) #输出test.txt?}q (X ??funcqc__main__sayhiqX ??ageqKX ??nameqX ??seven.
②反序列化
import pickle def sayhi(name): ??#在反序列化中必须写上此函数,不然会报错,因为在加载的时候,函数没有加载到内存 ???print("hello:",name) with open("test.txt","rb") as f: ???data = pickle.loads(f.read()) print(data.get("age")) data.get("func")("seven") ?#执行函数sayhi #输出32hello: seven ??#输出的函数体中的逻辑也是可以变的,这边我就不做演示了
小结:
- json值支持简单的数据类型,pickle支持所有的数据类型。
- pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。
- pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着新的函数体走的。
- pickle和json在3.0中只能dump一次和load一次,在2.7里面可以dump多次,load多次,anyway,以后只记住,只需要dump一次,load一次就可以了。
json&pickle序列化
原文地址:http://www.cnblogs.com/lin-777/p/7454527.html