Discuss / Python / 笔记 for Pickle&JSON

笔记 for Pickle&JSON

Topic source

郝仁E哥

#1 Created at ... [Delete] [Delete and Lock User]
#pickle序列化,并写入文件
import pickle
d=dict(name='Bob',age=20,score=80)
d['name']='Bill'
print(pickle.dumps(d))

#pickle.dump()直接把对象序列化后写入一个file-like Object
f=open('dump.txt','wb')
pickle.dump(d,f)
f.close()

#当我们要把对象从磁盘读到内存时,
#可以先把内容读到一个bytes,然后
#用pickle.loads()方法反序列化出对象,
#也可以直接用pickle.load()方法从一个
#file-like Object中直接反序列化出对象
f=open('dump.txt','rb')
d=pickle.load(f)
f.close()
print(d)

#JSON,JSON表示出来就是一个字符串,可以被所有语言读取
#不仅是标准格式,并且比XML更快,
#而且可以直接在Web页面中读取,非常方便
import json
d=dict(name='Bob',age=20,score=88)
print(json.dumps(d))  #dumps()方法返回一个str

#把JSON反序列化为Python对象,用loads()或者对应的load()方法
json_str ='{"age":20,"score":88,"name":"Bob"}'
print(json.loads(json_str))

#JSON进阶
class Student(object):
    def __init__(self,name,age,score):
        self.name = name
        self.age =age
        self.score=score

s=Student('Bob',20,95)
# 默认情况下,dumps()方法不知道如何将Student实例变为一个JSON的{}对象。
#可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要
#为Student专门写一个转换函数,再把函数传进去即可
def student2dict(std):
    return {
        'name':std.name,    
        'age':std.age,
        'score':std.score
    }

#Student实例首先被student2dict()函数转换成dict,
#然后再被顺利序列化为JSON
print(json.dumps(s,default =student2dict))

#通常class的实例都有一个__dict__属性,它就是一个dict,
#用来存储实例变量。也有少数例外,比如定义了__slots__的class
print(json.dumps(s,default =lambda obj:obj.__dict__))


#把JSON反序列化为一个Student对象实例,loads()方法首先转换出一个dict对象,
#然后,我们传入的object_hook函数负责把dict转换为Student实例
def dict2student(d):
    return Student(d['name'],d['age'],d['score'])

json_str ='{"age":20,"score":98,"name":"Bob"}'
#打印出的是反序列化的Student实例对象
print(json.loads(json_str,object_hook=dict2student)) 

#练习
#json.dumps 序列化时对中文默认使用的ascii编码.
#想输出真正的中文需要指定ensure_ascii=False
obj = dict(name='小明', age=20)
s = json.dumps(obj, ensure_ascii=True)
print(s)
s = json.dumps(obj, ensure_ascii=False)
print(s)

  • 1

Reply