0%

python案例

Python基础知识

实现TPS62873电压配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import sys
import os

name = sys.argv[1]
if name == 'CPU':
i2caddr='0x40'
else:
i2caddr='0x43'

vout = sys.argv[2]
vout_mv = float(vout) * 1000 - 400
Rvset = hex(int(vout_mv / 2.5 + 0.5))

print("%s"%Rvset)
os.system("i2ctransfer -f -y 3 w2@%s 0x02 0x05"%i2caddr)
result=os.popen("i2ctransfer -f -y 3 w1@%s 0x02 r1"%i2caddr).read().replace("\n", "")
if result != '0x05':
print("i2c write failed")
else:
print("i2c write 0x02 ok")

print(result)

os.system("i2ctransfer -f -y 3 w2@%s 0x00 %s"%(i2caddr,Rvset))
result=os.popen("i2ctransfer -f -y 3 w1@%s 0x00 r1"%i2caddr).read().replace("\n", "")
if result != Rvset:
print("i2c write failed")
else:
print("i2c write 0x00 ok")

print(result)

实现json数据整理到Excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import os
import json
import pandas as pd
import pandas as pd
import numpy as np
from openpyxl.utils import get_column_letter
from pandas import ExcelWriter
from datetime import datetime


def to_excel_auto_column_weight(df: pd.DataFrame, writer: ExcelWriter, sheet_name="Shee1"):
"""DataFrame保存为excel并自动设置列宽"""
# 数据 to 写入器,并指定sheet名称
df.to_excel(writer, sheet_name=sheet_name, index=False)
# 计算每列表头的字符宽度
column_widths = (
df.columns.to_series().apply(lambda x: len(str(x).encode('gbk'))).values
)
# 计算每列的最大字符宽度
max_widths = (
df.astype(str).applymap(lambda x: len(str(x).encode('gbk'))).agg(max).values
)
# 取前两者中每列的最大宽度
widths = np.max([column_widths, max_widths], axis=0)
# 指定sheet,设置该sheet的每列列宽
worksheet = writer.sheets[sheet_name]
for i, width in enumerate(widths, 1):
# openpyxl引擎设置字符宽度时会缩水0.5左右个字符,所以干脆+2使左右都空出一个字宽。
worksheet.column_dimensions[get_column_letter(i)].width = width + 2

DIR='./data/report'

header = ['PlanId', '测试板编号', 'IP地址', 'SN', '板子状态', '测试耗时', 'NovaOs版本', '失败模块', '测试结果']

DataList = []

for root, dirs, files in os.walk(DIR):
for name in dirs:
sub_dir = os.path.join(root, name)
file = sub_dir + '/' + "result.json"
if os.path.exists(file):
with open(file, 'r') as f:
data = json.load(f)
serial = data['board_results'][-1]['board']['serial']
ip = data['board_results'][-1]['board']['ip']
sn = data['board_results'][-1]['board']['sn']
board_status = data['board_results'][-1]['board_status']
test_duration = data['board_results'][-1]['test_duration']
test_result = data['board_results'][-1]['test_result']
version = data['board_results'][-1]['version']
failed_features = data['board_results'][-1]['failed_features']
row=[name, serial, ip, sn, board_status, test_duration, version, failed_features, test_result]
DataList.append(row)
df = pd.DataFrame(DataList, columns=header)

df.style.set_properties(**{'text-align': 'center'}).set_table_styles([ dict(selector='th', props=[('text-align', 'center')])])

#print(df['IP地址'].unique())
writer = pd.ExcelWriter('report.xlsx')
for i in df['IP地址'].unique():
#df[df['IP地址'] == i].to_excel(writer, sheet_name=i, index=False)
tmpData=df[df['IP地址'] == i]
to_excel_auto_column_weight(tmpData, writer, i)

writer.close()

now = datetime.now()
time = now.strftime("%Y-%m-%d-%H_%M_%S")

os.system(f"sudo tar zcvf {time}_report.tar.gz /home/slt-racetrack-server/data/ ./report.xlsx")
os.system("sudo rm -rf /home/slt-racetrack-server/data/*")
os.system("sudo rm -rf ./report.xlsx")

实现json数据整理为特定格式的Excel

截取的部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
directory_path = str(self.test_result_root/ '..' / '..' / 'report')
dir_list = os.listdir(directory_path)

self.logger.debug('%s'%dir_list)
#获取以“report+时间”命名的report目录
for item in dir_list:
full_path = os.path.join(directory_path, item)
if self.is_directory(full_path) and item.startswith("report_"):
self.logger.debug('%s'%full_path)
break

workbook = load_workbook(f"{full_path}/report.xlsx")
worksheet = workbook["模板"]
#填充表单的基本信息
newsheet = workbook.copy_worksheet(worksheet)
newsheet['B2'] = test_plan.server_msg[0].serial
newsheet['D2'] = test_plan.server_msg[0].ip
newsheet['F2'] = test_plan.server_msg[0].sn
newsheet['B4'] = plan_id
newsheet['D4'] = board_result.test_duration
newsheet['F4'] = test_plan.tester
newsheet['B6'] = board_result.version
if board_result.test_result == 'FAIL':
newsheet['F6'] = 'FAIL'
else:
newsheet['F6'] = 'PASS'

#以planid和sn码命名表单名称
newsheet.title = str(test_plan.server_msg[0].sn + '_' + plan_id)

yamlfile = str(self.test_result_root/ '..' / 'yaml' /test_plan.server_msg[0].ip) + '.yaml'

self.logger.debug('%s'%yamlfile)
with open(yamlfile, 'r') as file:
data = yaml.safe_load(file)

#拷贝测试的log目录,方便后期打包
os.system("cp -r %s %s"%(board_result.test_report,full_path))

#根据测试方案,制作测试项列表
test_items = data['msg'][1].get('test_items', [])
for index, item in enumerate(test_items):
itemname = item.get('name')
newsheet[ f'A%d'%(index + 9)] = itemname
newsheet[ f'C%d'%(index + 9)] = item.get('times')
#截取item中的test之后的字符串
start_index = itemname.find("test") + len("test")
end_index = len(itemname)
substring = itemname[start_index:end_index]

result_field = 'none'

#遍历log目录中item的log文件是否存在,存在则截取pass或failure字段,反之则为NONE
for root, dirs, files in os.walk(board_result.test_report):
for file in files:
if re.search(substring, file, re.I) != None:
filename = os.path.join(root, file)
start_index = filename.rfind('_') + 1
end_index = filename.find('.', start_index)
result_field = filename[start_index:end_index]
if result_field == 'failure':
newsheet[ f'E%d'%(index + 9)] = "FAIL"
break
elif result_field == 'pass':
newsheet[ f'E%d'%(index + 9)] = "PASS"

if result_field == 'none':
newsheet[ f'E%d'%(index + 9)] = "NONE"

#保存添加的sheet表
workbook.save(f"{full_path}/report.xlsx")

Python3数据分析图表的绘制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import numpy as np  
import matplotlib.pyplot as plt

x = []

y1 = []
y2 = []
y3 = []

for outVol in range(500, 800, 3):
tempVol = outVol - 400
rset1=hex(int(tempVol / 2.5))
rset2=hex(round(tempVol / 2.5))

int_rset1 = int(rset1, 16)
int_rset2 = int(rset2, 16)
outT1=outVol - (int_rset1 * 2.5 + 400)
outT2=outVol - (int_rset2 * 2.5 + 400)
y1.append(outT1)
y2.append(0)
y3.append(outT2)
x.append(outVol)


plt.figure()

plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)

# 添加标题和坐标轴标签
plt.title('Modulo-round')
plt.xlabel('Output Voltage')
plt.ylabel('Voltage deviation')

# 显示图形
#plt.show()
plt.savefig('output.png')