背景:
有AB两部分测试数据,需要把这两部分的数据各提取出来,写到另一个文档里面,每一部分都有多个csv文档,手动操作不仅效率低且费时,并且有出现错误的概率,所以利用python来编写一个自动提取数据的脚本来提高工作效率。
目的:
把AB两部分的csv文档数据提取出来,按照格式(顺序排列)写入到另一个文档里面。
A部分
B部分
以下是AB两部分的csv待处理数据A文件和数据B文件,这里只截取了部分,实际上数据较多
我们要把AB表格里的Bandwidth(带宽)字段和Lantency(延时)数据,按下面表格的形式写进去,RandRead为A表格数据,RandWrite为B表格数据,说实话我自己看着都眼花。。更别说手动一个个填进去。。。那可真是不小的工作量!
思路:先提取A数据,再提取B数据,然后AB数据交叉相加,再把数据类型转换输出,得到的两列数据即为Q1+Q32
1、提取数据A和数据B代码
根据AB两个表格,我们只需要第五列和六列的数据,所以在遍历读取每一行的时候,把这两列的数据拿出来就可以了!这里有单位需要换算,我们需要先把数据类型转换成int,再做乘除法。
#!/usr/bin/env python
'''
*- coding: utf-8 -*-
@Project :PythonProject
@File : test_Demo1.py
@Author : fushengshuo
@Date : 2023/3/2 11:19
@Module :
@Description :
'''
import csv
from itertools import chain
# A数据文件地址
ran_read_datapath = "E:\\Desktop\\zlf\\sda\\A\\sda_dataA.csv"
# B数据文件地址
ran_write_datapath = "E:\\Desktop\\zlf\\sda\B\\sda_dateB.csv"
# 填写 '1job' or '4job'
Jobs = '1job'
# 提取数据输出的文件路径
Output_datapath = "E:\\Desktop\\zlf\\sda\\output\\sum_AB.csv"
# 打开A数据文件
with open(ran_read_datapath, mode="rt", encoding="utf-8-sig") as RdFile:
Q1_1, Q32_1 = [[] for x in range(2)]
Q1_2, Q32_2 = [[] for x in range(2)]
Reader = csv.reader(RdFile)
# 逐行获取数据
for row in Reader:
if Jobs in row:
if '1QD' in row:
row_Rt1Q = int(row[5]) * 0.001024
Q1_1.append(row_Rt1Q)
Q1_2.append(row[6])
elif '32QD' in row:
row_Rt32Q = int(row[5]) * 0.001024
Q32_1.append(row_Rt32Q)
Q32_2.append(row[6])
Rd_Bandwidth = Q1_1 + Q32_1
Rd_Lantency = Q1_2 + Q32_2
print("提取的A数据:\n",Rd_Bandwidth,Rd_Lantency)
header_list = ["带宽", "延时"]
# 打开B数据文件
with open(ran_write_datapath, mode="rt", encoding="utf-8-sig") as WrFile:
Q1_3, Q32_3 = [[] for x in range(2)]
Q1_4, Q32_4 = [[] for x in range(2)]
Reader = csv.reader(WrFile)
for row in Reader:
if Jobs in row:
if '1QD' in row:
row_Wt1Q = int(row[5]) * 0.001024
Q1_3.append(row_Wt1Q)
Q1_4.append(row[6])
elif '32QD' in row:
row_Wt32Q = int(row[5]) * 0.001024
Q32_3.append(row_Wt32Q)
Q32_4.append(row[6])
Wr_Bandwidth = Q1_3 + Q32_3
Wr_Lantency = Q1_4 + Q32_4
print("提取的B数据为:\n",Wr_Bandwidth,Wr_Lantency)
运行脚本查看结果,已经获取到我们想要的那两列数据,接下来就是要把这些数据按照测试报告的格式写入到文档就OK了。
2、将数据A和数据B交叉相加,以列的形式写入文档
经过上面的脚本处理,获取到的AB数据总共由四个列表组成,为abcd,我们要把这四个列表进行交叉相加,组成两个新的列表,即为A=a+c;B=b+d。
Bandwidth_list = list(chain.from_iterable(zip(Rd_Bandwidth, Wr_Bandwidth)))
Lantency_list = list(chain.from_iterable(zip(Rd_Lantency, Wr_Lantency)))
rows = zip(Bandwidth_list, Lantency_list)
# 打开文件并写入
with open(Output_datapath, mode="wt", encoding="utf-8-sig", newline="") as DataFile:
Write = csv.writer(DataFile)
Write.writerow(header_list)
for row in rows:
Write.writerow(row)
print("数据已提取到目录:", Output_datapath)
这里用到**chain.from_iterable()**迭代器对两个列表组合成一个列表,即为Bandwidth_list和Lantency_list,这时我们的数据还需要再转换为元组类型,否则写入就会以行的形式写入,达不到我们想要的效果!元组类型使用zip函数,zips=zip(list1,list2)形式。
运行脚本查看结果:
可以看到,已经自动生成我们命名的csv文档,打开查看数据和测试报告的数据一一对应,直接复制粘贴就可以啦!!!
总结:
脚本总体上来看还可以再优化,比如一次性提取文件夹下面所有的csv文档数据,那样就更方便,不过做到这一步我就很开心啦,毕竟目前我只是个编程小白,该脚本编写总共花了4-5个小时,难度不是很大,难的是思路,你要怎么提取数据以及后续的处理等等。
这是本人第一次在博客发表文章,后续如果有时间会把个人成长记录到博客里面,希望我的内容对你有所帮助,如果你有好的建议或者觉得作者有需要改进的地方,欢迎向我反馈,还请各位大佬多多指教!/抱拳