day15 内置模块和开发规范
目标:掌握常见的内置模块的使用及了解软件开发的规范。
今日概要:
- 内置模块
- json
- time
- datetime
- re
- 开发规范
- 主文件
- 配置文件
- 数据
- 附件
- 业务代码
1. 内置模块
1.1 json
json模块:是 python 内部的一个模块,可以将 python 的数据格式转换为 json 格式的数据,也可以将 json 格式的数据转换为 python 的数据格式。
json 格式:是一个数据格式(本质上就是个字符串,常用于网络数据传输)
# Python中的数据类型的格式
data = [
{
"id": 1, "name": "轩小陌", "age": 18},
{
"id": 2, "name": "alex", "age": 18},
('xuanxiaomo',123),
]
# JSON格式
value = '[{"id": 1, "name": "轩小陌", "age": 18}, {"id": 2, "name": "alex", "age": 18},["xuanxiaomo",123]]'
1.1.1 核心功能
json格式用于跨语言数据传输,例如:A系统用Python开发,有列表类型和字典类型等。B系统用Java开发,有数组、map等的类型。语言不同,基础数据类型格式都不同。
为了方便数据传输,大家约定一个格式:json 格式,每种语言都可以将自己数据类型转换为 json 格式,也可以将 json 格式的数据转换为各自语言的数据类型。
Python 数据类型与 json 格式的相互转换:
-
数据类型 -> json ,一般称为:序列化
import json data = [ { "id": 1, "name": "轩小陌", "age": 18}, { "id": 2, "name": "alex", "age": 18}, ] res = json.dumps(data) print(res) >>输出结果: [{ "id": 1, "name": "\u8f69\u5c0f\u964c", "age": 18}, { "id": 2, "name": "alex", "age": 18}] res = json.dumps(data, ensure_ascii=False) print(res) >>输出结果: [{ "id": 1, "name": "轩小陌", "age": 18}, { "id": 2, "name": "alex", "age": 18}]
-
json格式 -> 数据类型,一般称为:反序列化
import json data_string = '[{"id": 1, "name": "轩小陌", "age": 18}, {"id": 2, "name": "alex", "age": 18}]' data_list = json.loads(data_string) print(data_list) >>输出结果: [{ 'id': 1, 'name': '轩小陌', 'age': 18}, { 'id': 2, 'name': 'alex', 'age': 18}]
练习题
-
写网站,给用户返回 json 格式数据
-
安装 flask 模块,协助我们快速写网站:
pip3 install flask
-
使用flask写网站
import json from flask import Flask app = Flask(__name__) def index(): return "首页" def users(): data = [ { "id": 1, "name": "武沛齐", "age": 18}, { "id": 2, "name": "alex", "age": 18}, ] return json.dumps(data) app.add_url_rule('/index/', view_func=index, endpoint='index') app.add_url_rule('/users/', view_func=users, endpoint='users') if __name__ == '__main__': app.run()
-
-
发送网络请求,获取 json 格式数据并处理。
import json import requests url = "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=5&page_start=20" res = requests.get( url=url, headers={ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" } ) # 获取json格式的数据: print(res.text) # 将json格式转换为python数据类型: data_dict = json.loads(res.text) print(data_dict)
1.1.2 类型要求
python的数据类型转换为 json 格式,对数据类型是有要求的,默认只支持:
+-------------------+---------------+
| Python数据类型 | JSON |
+===================+===============+
| dict | object |
+-------------------+---------------+
| list, tuple | array |
+-------------------+---------------+
| str | string |
+-------------------+---------------+
| int, float | number |
+-------------------+---------------+
| True | true |
+-------------------+---------------+
| False | false |
+-------------------+---------------+
| None | null |
+-------------------+---------------+
data = [
{
"id": 1, "name": "轩小陌", "age": 18},
{
"id": 2, "name": "alex", "age": 18},
]
其他类型如果想要支持,需要自定义JSONEncoder
才能实现【目前只需要了解大概意思即可,以后项目开发中用到了还会详细讲解。】,例如:
import json
from decimal import Decimal
from datetime import datetime
data = [
{
"id": 1, "name": "轩小陌", "age": 18, 'size': Decimal("18.99"), 'ctime': datetime.now()},
{
"id": 2, "name": "alex", "age": 18, 'size': Decimal("9.99"), 'ctime': datetime.now()},
]
# 定义一个MyJSONEncoder类,继承JSONEncoder类:
class MyJSONEncoder(json.JSONEncoder):
def default(self, o):
# 新增条件判断:当数据类型为Decimal和datetime时,分别进行特殊处理:
if type(o) == Decimal:
return str(o)
elif type(o) == datetime:
return o.strftime("%Y-%M-%d")
# 对于其他常规数据类型,仍然按原类中的处理方式:
return super().default(o)
res = json.dumps(data, cls=MyJSONEncoder)
print(res)
1.1.3 其他功能
json模块中常用的是:
-
json.dump
,将数据序列化并写入文件(不常用)import json data