从poatman导出的json里提取数据
把postman接口导出的json格式,现在想用python跑接口自动化,就需要提取postman中的参数信息存到excel表中,为了避免大量重复工作,因此写python脚本实现提取数据并保存到excel中
实现:用python直接提取json格式数据比较难,因为导出的json文件有4.5M文件太大直接读出来可能会把电脑内存撑爆导致电脑卡死
因此将json转为yaml格式后存起来进行读取,转换网址:https://www.bejson.com/json/json2yaml/
实现代码如下
# coding:utf-8
import yaml
import os
import ast # 将字符串转换为字典
import json
# 获取当前脚本所在文件夹路径
curPath = os.path.dirname(os.path.realpath(__file__))
# 获取yaml文件路径
yamlPath = os.path.join(curPath, "datas.yaml")
print('yamlPath', yamlPath)
# open方法打开直接读出来
f = open(yamlPath, 'r', encoding='utf-8')
cfg = f.read()
# print(type(cfg)) # 读出来是字符串
# print(cfg)
d = yaml.load(cfg, Loader=yaml.FullLoader) # 用load方法转字典
# print(d)
# print(type(d))
# print(d['item'])
for key, values in d.items():
# print("key:",key)
# print("value:",values)
for value in values:
# print(value)
modelNameType = value['name'] # 001享宇用户认证
print(modelNameType)
items = value['item']
print("---------")
for item in items:
# 接口名称
modelName = item['name']
print(modelName)
# 请求路由
path = item['request']['url']['variable'][0]['value'] # model/verifyapi/verifyIdcard
print(path)
# 请求方法
method = item['request']['method'] # POST
print(method)
# 传参
parms = item['request']['body']['raw'] #取出来的是字符串,想提取body里面的参数需转成字典
#parms_dist = ast.literal_eval(parms) #用ast.literal_eval转换字典执行过程中会报错,故用json.load转字典
parms_dist = json.loads(parms)#转字典
print(parms_dist)
# 产品编号
modelNo = parms_dist["prodId"]
print(modelNo)
print("============")
#输出示例如下:
反欺诈
---------
规则报告
model/openapi/xxx
POST
{'queryReason': '1', 'name': 'xxx', 'pid': '3203xxxxxxx1365', 'mobile': '18888888888', 'customType': 'normal', 'contacts': [{'name': '-121 ', 'phone': '0755-87654321', 'relationShip': '-121 '}], 'loanAmount': '100000000.00', 'loanTerm': '10000', 'homeAddress': '深圳市福田区深南大道1006 中心E', 'homePhone': '0755-800000$深心E', 'workName': 'xxx有限公司', 'workPhone': '0755-87654321000000', 'workAddress': '上海市闵行区2 室', 'address': '深圳市福深国际创新中心E 座', 'maritalStatus': 'single', 'email': 'zhangsan@163.com', 'token': 'J0xmJ1ux1eHrkINt', 'sign': 'UukinMTRJTEsCvCqagyw5I1J0qZ28wydUKS6AlijY9MAvMUDQc1jl3KwDWOw4b4rDQB9FVlDlz/MtfT2DcrFGccJoBq77W9viYTpA7L6+EZ2Jo0ie2aGQ46OmT2bW1DGTif1PIE7Lb1PJxjwKnsOryhlasLa2LgAlUx9jO4lTWKWcxdnheEOoNs688u8AddZhWkxqQaXeaAJmLJuz4x375hRvLQi4sr8xfMCy4Fzh+0KVNG91+ENcbtLoTfqLehsKckiR67B3jj2DdguSl8A5oSdjxtVB6X/42ZOU0fVh0IMI6Jjica2L4jCZ4YDzC6c4u79sfMNl0hNv1uhttwjfA==', 'prodId': 'BHAF_PRD01', 'requestTime': '2021-7-29 12:23:56', 'requestNo': 'dgfdfQdfg123456789'}
BHAF_PRD01
============
未实现文件夹下嵌套文件的代码如

只实现了类似下面的文件夹格式的读取

主要涉及到的知识点有:1如何读取yaml文件的数据,yaml格式的解读 2如何从字典中读数 3python如何将字典转换为字符串 4如何从列表中读数 5用pands写入excel
1yam解读
YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。 它的基本语法规则如下: 1、大小写敏感 2、使用缩进表示层级关系 3、# 表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样 YAML 支持的数据结构有三种: 1、对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary) 2、数组:一组按次序排列的值,又称为序列(sequence) / 列表(list) 3、纯量(scalars):单个的、不可再分的值。字符串、布尔值、整数、浮点数、Null、时间、日期 读取yaml: # 获取当前脚本所在文件夹路径 curPath = os.path.dirname(os.path.realpath(__file__)) # 获取yaml文件路径 yamlPath = os.path.join(curPath, "datas.yaml") # 加上 ,encoding='utf-8',处理配置文件中含中文出现乱码的情况。 f = open(yamlPath,'r',encoding='utf-8')
cfg = f.read()
d = yaml.load(cfg, Loader=yaml.FullLoader) # 用load方法转字典
2从字典中读数
字典格式解读:字典是另一种可变容器模型,且可存储任意类型对象。
d = {key1 : value1, key2 : value2 }
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
访问字典里的值
把相应的键放入熟悉的方括弧,如下实例:
#!/usr/bin/python
dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}
print "dict['Name']: ", dict['Name']
print "dict['Age']: ", dict['Age']
以上实例输出结果:
dict['Name']: Zara
dict['Age']: 7
使用items()函数遍历字典列表
#!/usr/bin/python
# coding=utf-8
dict = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'}
print "字典值 : %s" % dict.items()
# 遍历字典列表
for key,values in dict.items():
print key,values
3 python如何将字典转换为字符串
比如字符串
user_info = '{"name" : "john", "gender" : "male", "age": 28}'
想把它转为下面的字典:
user_dict = {"name" : "john", "gender" : "male", "age": 28}
有以下几种方法:
1、通过 json 来转换
>>> import json
>>> user_info= '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = json.loads(user_info)
>>> user_dict
{u'gender': u'male', u'age': 28, u'name': u'john'}
2、通过 eval
>>> usr_info = '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = eval(user_info)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
>>> user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
>>> user_dict = eval(user_info)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
通过 eval 进行转换就不存在上面使用 json 进行转换的问题。但是,使用 eval 却存在安全性的问题,比如下面的例子:
# 让用户输入 `user_info`
>>> user_info = raw_input('input user info: ')
# 输入 {"name" : "john", "gender" : "male", "age": 28},没问题
>>> user_dict = eval(user_info)
# 输入 __import__('os').system('dir'),user_dict 会列出当前的目录文件!
# 再输入一些删除命令,则可以把整个目录清空了!
>>> user_dict = eval(user_info)
3、通过 literal_eval
>>> import ast
>>> user = '{"name" : "john", "gender" : "male", "age": 28}'
>>> user_dict = ast.literal_eval(user)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
user_info = "{'name' : 'john', 'gender' : 'male', 'age': 28}"
>>> user_dict = ast.literal_eval(user)
>>> user_dict
{'gender': 'male', 'age': 28, 'name': 'john'}
4从列表中读数,三种遍历列表的方法:
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 if __name__ == '__main__':
4 list = ['html', 'js', 'css', 'python']
5
6 # 方法1
7 print '遍历列表方法1:'
8 for i in list:
9 print ("序号:%s 值:%s" % (list.index(i) + 1, i))
10
11 print '\n遍历列表方法2:'
12 # 方法2
13 for i in range(len(list)):
14 print ("序号:%s 值:%s" % (i + 1, list[i]))
15
16 # 方法3
17 print '\n遍历列表方法3:'
18 for i, val in enumerate(list):
19 print ("序号:%s 值:%s" % (i + 1, val))
20
21 # 方法3
22 print '\n遍历列表方法3 (设置遍历开始初始位置,只改变了起始序号):'
23 for i, val in enumerate(list, 2):
24 print ("序号:%s 值:%s" % (i + 1, val))
运行代码后结果:

5 pands写数据到excel
https://blog.csdn.net/mygodit/article/details/97640770
需要注意的是datas.yaml是需要变更的,datas.yaml是存放poatman接口导出后转成yaml去掉info后的yaml
/site1.xlsx文件是需要手动提前创建好的
最终实现代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import pandas as pd
import yaml
import os
import ast # 将字符串转换为字典
import json
def ReadYaml():
# 获取当前脚本所在文件夹路径
curPath = os.path.dirname(os.path.realpath(__file__))
# 获取yaml文件路径
yamlPath = os.path.join(curPath, "datas.yaml")
print('yamlPath', yamlPath)
# open方法打开直接读出来
f = open(yamlPath, 'r', encoding='utf-8')
cfg = f.read()
# print(type(cfg)) # 读出来是字符串
# print(cfg)
d = yaml.load(cfg, Loader=yaml.FullLoader) # 用load方法转字典
FetchData(d)
# print(d)
# print(type(d))
# print(d['item'])
def FetchData(d):
for key, values in d.items():
# print("key:",key)
# print("value:",values)
for value in values:
# print(value)
modelNameType = value['name'] # 001享宇用户认证
#print(modelNameType)
items = value['item']
list = []
dict = {}
seq = ('modelName', 'path', 'method', 'parms', 'modelNo')
dict = dict.fromkeys(seq)
for item in items:
# 接口名称
modelName = item['name']
print(modelName)
dict['modelName']=modelName
# 请求路由
path = item['request']['url']['variable'][0]['value'] # model/verifyapi/verifyIdcard
api_path="/"+path
print(api_path)
dict['path'] = api_path
# 请求方法
method = item['request']['method'] # POST
print(method)
dict['method'] = method
# 传参
parms = item['request']['body']['raw'] #字符串
# parms_dist = ast.literal_eval(parms) # 转字典
parms_dist = json.loads(parms)
dict['parms'] =parms_dist
# 产品编号
modelNo = parms_dist["prodId"]
print(modelNo)
dict['modelNo'] = modelNo
print("============")
list.append(dict)
print(list)
write(list)
list = []
def write(list):
# df = pd.DataFrame(list)
# df.to_excel('site.xlsx')
excel_name = "/site1.xlsx"
excel_path = os.path.dirname(os.path.abspath(__file__)) + excel_name
df = pd.read_excel(excel_path)
# 追加数据
ds = pd.DataFrame(list)
df = df.append(ds, ignore_index=True)
print(df)
df.to_excel(excel_path, index=False)
print('写入完毕')
if __name__ == '__main__':
ReadYaml()

浙公网安备 33010602011771号