day5-json & pickle序列化

概述

首先我们写入文件和读取文件的一般方法:

info={"name":"dick","age":22,"sex":"M"} 
f=open("info","w")
f.write(str(info))  #将字典信息info写入文件
#写入到文件info.txt的内容
{"name":"dick","age":22,"sex":"M"}

f1=open("name","r")
x=f1.read()
dict_name=eval(x)
print(dict_name["sex"])
#输出
"M"

从上面的例子可以看出,我们在写入文件中的数据,只能是字符串,但是如果要想把内存的数据对象写入到硬盘上怎么办呢?下面就来说说序列化:json & pickle,主要用于不同语言之间的数据交互。

json序列化

1.dumps序列化和loads反序列化

用法:对内容进行序列化,使用dumps和loads

序列化(dumps)

用法:json.dumps()函数(它表示“dump string”,而不是“dumps”)将一个Python 值转换成JSON 格式的数据字符串。在交互式环境中输入以下代码:

import json #导入模块
info={"name":"dick","age":22,"sex":"M"}
f=open("info.txt","w")
print(json.dumps(info),type(json.dumps(info)))
f.write((json.dumps(info)))
f.close()
#写入到文件info.txt的内容
{"name": "dick", "sex": "M", "age": 22} <class 'str'>   #将字典信息info以字符串形式写入文件

注意:该值只能是以下基本Python 数据类型之一:字典、列表、整型、浮点型、字符串、布尔型或None。

反序列化(loads)

用法:要将包含JSON 数据的字符串转换为Python 的值,就将它传递给json.loads()函数(这个名字的意思是“load string”,而不是“loads”)。在交互式环境中输入以下代码:

import json #导入模块
info={"name":"dick","age":22,"sex":"M"}
f1=open("test","r")
data=json.loads(f1.read())
print(data["age"])
f.close()
#输出
22

解析:导入json 模块后,就可以调用loads(),向它传入一个JSON 数据字符串。请注意,JSON 字符串总是用双引号。它将该数据返回为一个Python 字典。

2.dump序列化和load反序列化

用法:对文件对象进行序列化,使用dump和load

序列化(dump)

#导入模块
import json
# 写入 JSON 数据
info={"name":"dick","age":22,"sex":"M"}
with open('test', 'w') as f: #文件以写的方式打开
      json.dump(info, f)  #第1个参数是内存的数据对象 ,第2个参数是文件句柄
#写入到文件test.txt的内容 
{"name":"dick","age":22,"sex":"M"}  

序列化(load)

#导入模块
import json
# 读取数据
with open('test', 'r') as f: #以读的方式打开
    data = json.load(f)  #输入文件对象
    print(data.get("name"))
#输出
dick

pickle序列化

1.dumps序列化和loads反序列化

用法:对文件对象进行序列化,使用dumps和loads

序列化(dumps)

import pickle
info={"name":"dick","age":22,"sex":"M"}
f1=open("test","wb") #以二进制写入
f1.write(pickle.dumps(info))
f.close()
#输出到test.txt文件中的内容

反序列化(loads)

import pickle
f1=open("test","rb") #以二进制读取
data=pickle.loads(f1.read())
print(data)
f.close()
#输出
{'age': 22, 'sex': 'M', 'name': 'dick'}

2.dump序列化和load反序列化

序列化(dump)

import pickle
info={"name":"dick","age":22,"sex":"M"}
with open('test', 'wb') as f:
      pickle.dump(info, f)
#输出到文件

反序列化(load)

with open('test', 'rb') as f:
    data = pickle.load(f)  #反序列化内存对象
    print(data.get["sex"])
#输出
M

3.序列化函数

序列化(dumps)

import pickle

def sayhi():
     print("hello world!")


#序列化
info={"name":"dick","age":22,"sex":"M","func":sayhi}
f1=open("name","wb")
f1.write(pickle.dumps(info))  #与pickle.dump(info,f)相同效果
f.close()

序列化(loads)

#反序列化
def sayhi(name):
     print("hello world!",name)

f1=open("name","rb")  #以二进制读取
data=pickle.loads(f1.read()) #与data=pickle.load(f)相同效果
print(data["age"])
f.close()
#输出
22

小结

  1. pickle能够将整个函数进行序列化,但是pickle只能支持在Python本语言里面能用,java是不认识的,java只认识json
  2. 使用json时,dump一次load一次,可以dump n次,但是只能load 1次,所以,想要存写入新的字符,最好每次dump到不同的文件,就像虚机快照一样,其实存到不同的文件
posted @ 2017-08-03 10:48  Mr.hu  阅读(155)  评论(0编辑  收藏  举报