# ### json """ json 模块能够转化的数据类型如下: int float bool str list tuple dict None 8个数据类型可以序列化 json数据类型的提出,是让不同的语言之间形成数据交流 pickle返回的是二进制的字节流,它是用来进行数据的传输和存储的. json 序列化成一个字符串 pickle 序列化成一个字节流 """ import json # dumps 和 loads 是一对,用来序列化和反序列化的,在字符串和其他数据类型之间切换 dic = {'name':"黄文","age":8,"sex":"男性","family":['爸爸',"妈妈"]} # 序列化 ''' ensure_ascii=True 如果想要显示中文ensure_ascii = False sort_keys=True 对字典的键进行排序(默认按照ascii 从小到大排序) ''' res = json.dumps(dic,ensure_ascii=False,sort_keys=True) print(res,type(res)) # 反序列化 res = json.loads(res) print(res,type(res)) # dump 和 load 是一对, 用来进行数据的存储和提取 dic = {'name':"黄文","age":8,"sex":"男性","family":['爸爸',"妈妈"]} with open("ceshi001.json",mode="w",encoding="utf-8") as fp: json.dump(dic,fp,ensure_ascii=False) with open("ceshi001.json",mode="r",encoding="utf-8") as fp: res = json.load(fp) print(res,type(res)) # ###json 和 pickle 两个模块之间的区别; # json ''' 可以连续dump,但是load只能一次性把所有数据拿出来进行反序列化,造成数据错误 针对于这个弊端,可以使用loads来解决 ''' dic = {'a':1,"b":2} with open("ceshi002.json",mode="w",encoding="utf-8") as fp: json.dump(dic,fp) fp.write(' ') json.dump(dic,fp) fp.write(' ') print("<===>") with open("ceshi002.json",mode="r",encoding="utf-8") as fp: # res = json.load(fp) error for i in fp: # 读一行,反序列化成一个字典,依次循环. res = json.loads(i) print(res,type(res)) # pickle ''' 允许连续dump , 也允许连续load ''' import pickle dic = {'a':3,"b":4} with open("ceshi003.pkl",mode="wb") as fp: pickle.dump(dic,fp) pickle.dump(dic,fp) pickle.dump(dic,fp) pickle.dump(dic,fp) with open("ceshi003.pkl",mode="rb") as fp: ''' res = pickle.load(fp) print(res) res = pickle.load(fp) print(res) res = pickle.load(fp) print(res) res = pickle.load(fp) print(res) ''' # res = pickle.load(fp) # print(res) # 是否可以把所有数据都一次性拿出来? # 用try ... except ..抑制多调用的那一次的报错. try: while True: res = pickle.load(fp) print(res) except: pass ''' # json 和 pickle 两个模块的区别: (1)json序列化之后的数据类型是str,所有编程语言都识别, 但是仅限于(int float bool)(str list tuple dict None) json不能连续load,只能一次性拿出所有数据 (2)pickle序列化之后的数据类型是bytes, 所有数据类型都可转化,但仅限于python之间的存储传输. pickle可以连续load,多套数据放到同一个文件中 '''