什么叫序列化:
将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。
序列化的目的:
1. 以某种存储形式使自定义对象持久化
2. 将对象从一个地方传递到另一个地方
3. 使程序更具维护性
json 模块
json模块提供了四个功能:dumps、loads 和 dump、load
import json dic = {'k1':1, 'k2': 2, 'k3': 3} # 序列化 str_dic = json.dumps(dic) # dumps 就是将字典类型转换为字符串类型 print(type(str_dic), str_dic) # 执行结果: # <class 'str'> {"k1": 1, "k2": 2, "k3": 3} # 反序列化 dic2 = json.loads(str_dic) # loads 将字符串类型转换为字典类型 print(type(dic2), dic2) # 执行结果: # <class 'dict'> {'k2': 2, 'k3': 3, 'k1': 1}
dumps 和 loads 都是在内存中对数据进行操作,并没有将序列化后的数据保存到硬盘,程序退出,数据消失。如果要将序列化后的数据永久的保存起来,就需要使用 dump 和 load 来操作:
import json dic = {'k1':1, 'k2': 2, 'k3': 3} with open('test.json', 'w', encoding='utf-8') as f: json.dump(dic, f) # dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
with open('test.json', 'r', encoding='utf-8') as f: dic = json.load(f) # load 方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 print(type(dic), dic) # 执行结果: # <class 'dict'> {'k2': 2, 'k3': 3, 'k1': 1}
当序列化中数据含有中文,建议添加ensure_ascii关键字参数来进行序列化,这样在json文件中依然会显示中文
import json dic = {'k1': '中国', 'k2': '美国', 'k3': 3} with open('file.json', 'w', encoding='utf-8') as f: json.dump(dic, f, ensure_ascii=False)
json的格式化输出:
import json data = {'username':['小明','baby'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=2,separators=(',',':'),ensure_ascii=False) print(json_dic2) 执行结果: { "age":16, "sex":"male", "username":[ "小明", "baby" ] }
实例:
使用 json 模块实现用户注册登录:
#!/usr/bin/python3 # -*- coding: utf-8 -*- # Author: hkey import json import os def file_oper(file, mode, *args): if mode == 'w': user_info = args[0] with open(file, mode) as f: json.dump(user_info, f) elif mode == 'r': with open(file, mode) as f: user_info = json.load(f) return user_info def regist(file): user_dict = file_oper(file, 'r') while True: username = input('username:').strip() if not username: continue if username in user_dict: print('