上篇博文《用python的mako模板库写一个自动生成.c/.h文件generate_code功能》中,其中解析excel这块儿,我用的是xlwings这个包,其中还有没解决的问题。这篇文章换用pandas解析excel并封装为json格式的。
要处理的数据是这样的:
名称 | 变量代码 | 信号名称 | 起始位 | 信号长度 | 分辨率 | 偏移量 | 初始值 | 无效值 | 信号值描述 | 变量代码类型 |
id | var_code | signal_name | start_bit | signal_len | resolution | offset | initial_val | invalid_val | signal_comment | var_type |
0x387 | TBOX_Satellite_Time_Hour | 小时 | 24 | 8 | 1 | 0 | 0x0 | / | 0x0:0 | int8_t |
0x387 | TBOX_SatelliteTime_Minute | 分钟 | 32 | 8 | 1 | 0 | 0x0 | / | 0x17:23 0x0:0 0x3B:59 | int8_t |
0x999 | TBOX_SatelliteTime_Minute | 分钟 | 32 | 8 | 1 | 0 | 0x0 | / | 0x17:23 0x0:0 0x3B:59 | int8_t |
处理后我想要的数据json格式是这样的:
[
{
"id": "0x387",
"values": [
{
"id": "0x387",
"var_code": "TBOX_Satellite_Time_Hour",
"signal_name": "小时",
"start_bit": 24,
"signal_len": 8,
"resolution": 1,
"offset": 0,
"initial_val": "0x0",
"invalid_val": "\/",
"signal_comment": "0x0:0",
"var_type": "int8_t"
},
{
"id": "0x387",
"var_code": "TBOX_SatelliteTime_Minute",
"signal_name": "分钟",
"start_bit": 32,
"signal_len": 8,
"resolution": 1,
"offset": 0,
"initial_val": "0x0",
"invalid_val": "\/",
"signal_comment": "0x17:23 0x0:0 0x3B:59",
"var_type": "int8_t"
}
]
},
{
"id": "0x999",
"values": [
{
"id": "0x999",
"var_code": "TBOX_SatelliteTime_Minute",
"signal_name": "分钟",
"start_bit": 32,
"signal_len": 8,
"resolution": 1,
"offset": 0,
"initial_val": "0x0",
"invalid_val": "\/",
"signal_comment": "0x17:23 0x0:0 0x3B:59",
"var_type": "int8_t"
}
]
}
]
用pandas库这样写,满足了我的要求:
import os
import pandas as pd
from mako.template import Template
from pandas.io import json
''' 1,解析excel,提取 entity 数据信息封装成dic'''
def parse_excel(file_path):
df = pd.read_excel(file_path, header=1)
res = df.groupby('id').apply(lambda x: x.to_dict('records'))
# res.to_json('data.json',orient='table',force_ascii=False)
return res.to_json(orient='table', force_ascii=False)
''' 2.根据mako模板生成.h/.c文件'''
def generate_code_h(tables: json):
h_file = Template(filename='./mako_template/entity_h.mako', module_directory='./mako_template/tmp').render(
**json.loads(tables))
out_file = './generate_file/'
if not os.path.exists(out_file):
os.makedirs(out_file)
with open(out_file + 'entity_h.h', 'wb+') as f:
f.write(h_file.encode('utf-8'))
print('h_file 文件生成,成功 @——@')
return os.path.abspath(out_file + 'entity_h.h')
if __name__ == '__main__':
excel = 'C:\\Users\\15839680585\\Desktop\\template\\Desktop\\entity2.xlsx'
generate_code_h(parse_excel(excel))
从结果上可以看出,这样写的话,对比上篇,代码会少很多,总重要的是不用自己去思考表格的处理细节。
掌握潘达 提供的一些excel的处理方法,对日常工作中表格数据更方便。