分层设计
把代码按照不同的功能分别放到不同的子文件夹中进行管理,代码分层。
- 测试用例模块:testcases
- 测试数据目录:testdata
- 测试报告目录:reports
- 公共模块:common
- 项目入口文件:
1. json数据
JSON(JavaScript Object Notation)` 是一种轻量级的数据交换格式,易于阅读和理解。JSON 格式可以对高纬数据进行表达和存储。
json 格式通过键值对来表达信息,键是字符串,值可以是:
值 | 语法 |
---|---|
对象 | 一对大括号包裹,元素时键值对,键值对用逗号分隔{key:value} |
数组 | 一对中括号包裹,元素时 json 可以表达的所有数据类型,元素之间使用逗号分隔[value1,value2,value3] |
字符串 | 双引号包裹'zlf' |
整数 | 12 |
浮点数 | 1.2 |
布尔型 | true,false |
空 | null |
例如:
{
"name": "zlf",
"age": 18,
"hobby": ["旅游","游戏"],
"friends": [
{
"name": "刘德华"
},
{
"name": "张国荣"
}
]
}
{'name': 'zlf',
'age': 18,
'hobby': ['旅游', '游戏'],
'friends': [{'name': '刘德华'}, {'name': '张国荣'}]}
创建一个名为zlf.json 的文本文件,将上面的json数据写入文件中。
2. python操作 json 文件
直观上,json 格式和python中的对象类似,对应表示关系如下:
json | python |
---|---|
对象(object) | 字典(dict) |
数组(array) | 列表(list) |
字符串(string) | 字符串(str) |
整数(int) | 整数(int) |
实数(float) | 实数(float) |
true | True |
false | False |
nill | None |
直接通过字符串解析 json 文件不是太简单,python提供了内置 json 模块用来解析 json 文件。
2.1 json 反序列化为 python
python对象转 json 字符串称为序列化,反之为反序列化。
json 模块提供了两个函数来支持 json 字符串反序列化为一个 python 对象。
- json.loads(s)
接收一个 json 格式的字符串,反序列化一个python对象。如果参数 s 的格式不满足 json 格式,抛出 JSONDecodeError异常。
[12]:
import json
json_str = '{"name": "zlf", "age": 18}'
print(json_str, type(json_str))
load_data = json.loads(json_str)
print(load_data, type(load_data))
{"name": "zlf", "age": 18} <class 'str'>
{'name': 'zlf', 'age': 18} <class 'dict'>
- json.load(fb)
有时候需要从 json 文件中加载数据,这是一个快捷方法。接收一个以读方式打开的 json 文件对象,将文件中的 json 数据反序列化为一个python对象。
import json
with open('zlf.json','r',encoding='utf-8')as f:
load_data = json.load(f)
print(load_data, type(load_data))
{'name': 'zlf', 'age': 18, 'hobby': ['旅游', '游戏'], 'friends': [{'name': '刘德华'}, {'name': '张国荣'}]} <class 'dict'>
python 序列化为 json
与反序列化类型,序列化 json 模块也提供了两个对应的函数
-
json.dumps(obj,ensure_ascii=True,indent=None,sort_False)
将一个 python 对象序列化为一个 json 格式的字符串。
- obj: python 对象
- ensure_ascii:默认为True,输出保证将所有输入的非ASCLL字符转义。如果ensure_ascii是false,这些字符会原样输出。
- indent:一个非负整数或者字符串,json 数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零,负数或者"",则只会添加换行符。None''(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果indent是一个字符串(比如''"\t"),那这个字符串会被用于缩进每一层。
- sort_False:为True(more为False),表示字典的输出会以键的顺序排序。
import json
data = {
"name": "zlf",
"age": 18,
"hobby": ["旅游","游戏"],
"friends": [
{
"name": "刘德华"
},
{
"name": "张国荣"
}
]
}
json_str = json.dumps(data)
print(json_str)
print(json.dumps(data,ensure_ascii=False))
print(json.dumps(data,ensure_ascii=False,indent=4))
print(json.dumps(data,ensure_ascii=False,indent=4,sort_keys=True))
{"name": "zlf", "age": 18, "hobby": ["\u65c5\u6e38", "\u6e38\u620f"], "friends": [{"name": "\u5218\u5fb7\u534e"}, {"name": "\u5f20\u56fd\u8363"}]}
{"name": "zlf", "age": 18, "hobby": ["旅游", "游戏"], "friends": [{"name": "刘德华"}, {"name": "张国荣"}]}
{
"name": "zlf",
"age": 18,
"hobby": [
"旅游",
"游戏"
],
"friends": [
{
"name": "刘德华"
},
{
"name": "张国荣"
}
]
}
{
"age": 18,
"friends": [
{
"name": "刘德华"
},
{
"name": "张国荣"
}
],
"hobby": [
"旅游",
"游戏"
],
"name": "zlf"
}
- json.dump(obj,fb,ensure_ascii=True,indent=None,sort_False)
将一个 python 对象序列化为 json 数据后写入一个以 w 模式打开的文件。 - fb:一个以文件写打开的文件句柄
其他参数同json.dumps()
import json
data = {
"name": "zlf",
"age": 18,
"hobby": ["旅游","游戏"],
"friends": [
{
"name": "刘德华"
},
{
"name": "张国荣"
}
]
}
with open("zlf.json","a",encoding='utf-8')as f:
json.dump(data,f,ensure_ascii=False,indent=4)