1、json模块
Json是一种轻量级的数据交换格式,在日常开发中经常需要从Json字符串中提取数据,或者把数据转换为Json字符串,Python中内置了一个
json模块
来处理Json数据。json模块提供了下述四个函数来完成相互转换:
- json.load():Json转字典,接受包含json数据的文件对象。
- json.loads():Json转字典,接受json字符串,而非文件对象。
- json.dump():字典转Json,第一个参数为对象字典,第二个参数为文件对象,直接写入文件。
- json.dumps():字典转Json,第一个参数为对象字典。
dump和dumps还有下述这些常用的可选参数:
- ensure_ascii:默认True,保证转换后的json全是ascii字符,非ascii字符都会被转义。如果数据中包含中文或非ascii字符,最好将ensure_ascii设置为False,保证输出结果正常。
- indent:缩进,默认None,没有缩进,设置为正整数,输出格式会按指定的半角空格数缩进。
- separators:设置分隔符,默认分隔符为(,和:)
- sort_keys:默认False,输出结果是否按照字典中的key进行排序。
使用代码代码示例如下:
import json json_str = """ { "code": "200", "data": [ { "create_time": "2小时前", "id": 3, "title": "对话董明珠:这个时代要倡导利他思想", "url": "https://www.thepaper.cn/newsDetail_forward_3131849" } ], "msg": "请求成功" } """ if __name__ == '__main__': # Json字符串转字典 print(json.loads(json_str)) # 解析一个Json文件转字典 with open('test.json', 'r+', encoding='UTF-8') as f: print(json.load(f)) origin_dict = {'code': '200', 'data': [{'create_time': '刚刚', 'id': 1, 'title': '字典转Json', 'url': '测试'}], 'msg': '请求成功'} # 字典转Json打印出来 print(json.dumps(origin_dict, ensure_ascii=False)) # 字典转Json写入文件 with open('result.json', 'w+', encoding='UTF-8') as f: json.dump(origin_dict, f, ensure_ascii=False, indent=8)
运行结果如下:
# 控制台输出: {'code': '200', 'data': [{'create_time': '2小时前', 'id': 3, 'title': '对话董明珠:这个时代要倡导利他思想', 'url': 'https://www.thepaper.cn/newsDetail_forward_3131849'}], 'msg': '请求成功'} {'code': '200', 'data': [{'create_time': '23分钟前', 'id': 4, 'title': '脸书与逾150家公司分享用户数据,美国检方正展开刑事调查', 'url': 'https://www.thepaper.cn/newsDetail_forward_3132840'}], 'msg': '请求成功'} {"code": "200", "data": [{"create_time": "刚刚", "id": 1, "title": "字典转Json", "url": "测试"}], "msg": "请求成功"} # 输出的json文件内容: { "code": "200", "data": [ { "create_time": "23分钟前", "id": 4, "title": "脸书与逾150家公司分享用户数据,美国检方正展开刑事调查", "url": "https://www.thepaper.cn/newsDetail_forward_3132840" } ], "msg": "请求成功" }
Python对象与Json对象之间的关系如下表所示:
Python | Json |
dict | object |
list, tuple | array |
str | string |
int, float | number |
True | true |
False | false |
None | null |
2、pickle模块
pickle模块
是Python提供的用于「对象序列化和反序列化」的模块,存取结构化数据。比如把一个字典保存到文件中,以及读取出来,使用普通的file写入的是字符串,读取的也是字符串。而使用 pickle 的话,写入的是字典,读取出来的,也是字典。跟json模块一样,只有四个函数:
- dumps():将数据通过特殊的形式转换为只有Python语言认识的字符串。
- dump():同dumps,并写入文件。
- loads():将pickle数据转换为Python的数据结构。
- load():从数据文件读取,并转换为Python的数据结构。
使用pickle模块的一些注意事项:
- pickle除了支持Python中所有的数据类型外,还支持函数,类,以及类的实例。
- load()函数,必须以二进制可读的模式打开,即"rb";dump()函数,则需要以二进制可写的模式打开,即"wb"。
使用pickle模块可能出现的异常:
- PickleError:封装和拆封时出现的异常类,继承自Exception。
- PicklingError: 遇到不可封装的对象时出现的异常,继承自PickleError。
- UnPicklingError: 拆封对象过程中出现的异常,继承自PickleError。
示例代码如下:
import pickle if __name__ == '__main__': test_dict = {'code': '200', 'data': [{'create_time': '2小时前', 'id': 3, 'title': '对话董明珠:这个时代要倡导利他思想', 'url': 'https://www.thepaper.cn/newsDetail_forward_3131849'}], 'msg': '请求成功'} # 序列化 p_str = pickle.dumps(test_dict) print("序列化字典:", p_str) # 反序列化 print("反序列化字典:", pickle.loads(p_str)) # 序列化到文件中 with open("test.pkl", 'wb') as f: pickle.dump(test_dict, f) # 从文件中序列化 with open("test.pkl", 'rb') as f: print("从文件中序列化:", pickle.load(f))