Python 解析c文件并导出到Excel

news2024/12/23 14:37:20

文章目录

  • 1. 目录结构:
  • 2.代码
    • 1. test.c
    • 2. write_excel.py
    • 3. cparser.py
    • 4. 模板.xlsx
    • 5. output.xlsx

脚本中主要使用 openpyxl cparser

1. 目录结构:

在这里插入图片描述

  • ast.txt :存放解析 c 文件的语法树,便于查找内容
  • cparser.py :解析 c 文件,并调用 write_excel.py 中封装的类写入 output.xlsx
  • output.xlsx : 存放以模板的样式存放函数
  • test.c : 需要解析的 c 文件
  • write_excel.py : 为 cparser.py 提供接口,写入 output.xlsx
  • 模板.xlsx : 模板样式

2.代码

1. test.c

#include <stdio.h>
#include <stdlib.h>

#define lsdl 2

int g_a =3;

void show(void)
{
    printf("hello show");
}

int add(int variate_a, int variate_b)
{
    int variate_c = variate_a * variate_b;
    variate_a += variate_b;
    variate_a += g_a;

    return variate_c-variate_a;
}

int main(void)
{
    int a =lsdl;
    int b =3;
    //printf("c = %d", add(a, b));
    return 0;
}

2. write_excel.py

import openpyxl
from openpyxl.styles import Alignment
import copy
import re

class WriterExcel():
    source_path = r'.\模板.xlsx'
    target_path = r'.\output.xlsx'

    source_temp_data_list = []

    copyfuncnum = 0



    def __init__(self, start_num) -> None:
        self.source_excel = openpyxl.load_workbook(self.source_path)
        self.source_Sheet1 = self.source_excel['Sheet1']
        self.source_Sheet2 = self.source_excel['Sheet2']
        
        self.target_excel = openpyxl.load_workbook(self.target_path)
        self.target_Sheet1 = self.target_excel['Sheet1']
        self.ClearSheet(self.target_Sheet1)

        self.start_num = start_num

    def ClearSheet(self, tagSheet):
        """
        @ 功能: 清空工作表
        @ 参数:目标工作表
        @ 返回值:
        """
        tagSheet.delete_rows(1, tagSheet.max_row)
        
        for row in tagSheet.iter_rows():
            for cell in row:
                cell.style = 'Normal'


    def CopyCell(self, sourow, sourcol, targrow, targcol):
        """
        @ 功能: 复制单元格的值、格式、填充色
        @ 参数:单元格源,工作表源,目标单元格,目标工作表
        @ 返回值:
        """

        self.target_Sheet1.cell(targrow, targcol).value = self.source_Sheet1.cell(sourow, sourcol).value  # 复制单元格的值
        if self.source_Sheet1.cell(sourow, sourcol).has_style:   # 判断该单元格是否有特殊格式
            self.target_Sheet1.cell(targrow, targcol).fill = copy.copy(self.source_Sheet1.cell(sourow, sourcol).fill)
            self.target_Sheet1.cell(targrow, targcol).border = copy.copy(self.source_Sheet1.cell(sourow, sourcol).border)
            self.target_Sheet1.cell(targrow, targcol).font = copy.copy(self.source_Sheet1.cell(sourow, sourcol).font)
            self.target_Sheet1.cell(targrow, targcol).alignment = copy.copy(self.source_Sheet1.cell(sourow, sourcol).alignment)

    def GetSourData(self):

        self.source_temp_data_list = self.source_Sheet1['A1:H16']  # 获取模板数据

    def WriteLine1(self, row, funcName):
        """
        @ Line 1
        """
        
        self.CopyCell(1, 1, row, 1)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=1, end_column=8)
        self.target_Sheet1.cell(row = row, column=1).alignment = Alignment(horizontal='left')

        self.target_Sheet1.cell(row= row, column= 1).value = f'1.{self.copyfuncnum +1} {funcName}'

    def WriteLine2(self, row):
        """
        @ Line 2
        """
        
        for col in range(1, 9):
            self.CopyCell(2, col, row, col)

    def WriteLine3(self, row):
        """
        @ Line 3
        """
        
        for col in range(1, 9):
            self.CopyCell(3, col, row, col)

        self.target_Sheet1.cell(row= row, column= 1).value = f'SWDD-BMU-{self.copyfuncnum +1}'

    def WriteLine4(self, row):
        """
        @ Line 3
        """
        
        self.CopyCell(4, 1, row, 1)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=1, end_column=8)

    def WriteLine5(self, row):
        """
        @ Line 5
        """
        
        for col in range(1, 9):
            self.CopyCell(5, col, row, col)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=2, end_column=8)

    def WriteLine6(self, row):
        """
        @ Line 6
        """
        
        for col in range(1, 9):
            self.CopyCell(6, col, row, col)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=2, end_column=8)

    def WriteLine7(self, row):
        """
        @ Line 7
        """
        
        for col in range(1, 9):
            self.CopyCell(7, col, row, col)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=2, end_column=8)

    def WriteLine8(self, row):
        """
        @ Line 8
        """
        
        for col in range(1, 9):
            self.CopyCell(8, col, row, col)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=2, end_column=8)

    def WriteLine9(self, row):
        """
        @ Line 9
        """
        
        for col in range(1, 9):
            self.CopyCell(9, col, row, col)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=5, end_column=8)

    def WriteLine10(self, row, paraList):
        """
        @ Line 10
        """

        if len(paraList) >= 1:
            for index in range(len(paraList)):
                for col in range(1, 9):
                    self.CopyCell(10, col, row, col)
                self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=5, end_column=8)

                if paraList[index][0] != None:
                    self.target_Sheet1.cell(row= row, column= 3).value = paraList[index][0]
                    self.target_Sheet1.cell(row= row, column= 4).value = paraList[index][1]
                else:
                    self.target_Sheet1.cell(row= row, column= 2).value = '-'
                row += 1
        else:
            for col in range(1, 9):
                self.CopyCell(10, col, row, col)
            self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=5, end_column=8)

    def WriteLine11(self, row, retList):
        """
        @ Line 11
        """
        for col in range(1, 9):
            self.CopyCell(11, col, row, col)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=5, end_column=8)

        if len(retList) != 0:
            self.target_Sheet1.cell(row= row, column= 3).value = retList[0]
            self.target_Sheet1.cell(row= row, column= 4).value = retList[1]
        else:
            self.target_Sheet1.cell(row= row, column= 2).value = '-'


    def WriteLine12(self, row):
        """
        @ Line 12
        """
        for col in range(1, 9):
            self.CopyCell(12, col, row, col)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=2, end_column=8)

    def WriteLine13(self, row, fileName):
        """
        @ Line 13
        """
        for col in range(1, 9):
            self.CopyCell(13, col, row, col)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=2, end_column=8)

        self.target_Sheet1.cell(row= row, column= 2).value = fileName

    def WriteLine14(self, row):
        """
        @ Line 14
        """
        for col in range(1, 9):
            self.CopyCell(14, col, row, col)
        self.target_Sheet1.merge_cells(start_row= row, end_row= row, start_column=2, end_column=8)


    def SaveAll(self):
        self.target_excel.save(self.target_path)
        self.source_excel.save(self.source_path)

3. cparser.py

# parser_file 用于处理c语言文件
from pycparser import parse_file
from pycparser import CParser
# c语言有错误时,会引出此错误
from pycparser.plyparser import ParseError
# c_ast.py 文件下包含了抽象语法树的节点类
from pycparser.c_ast import *

import write_excel
from write_excel import WriterExcel



class CParserInfo:
    current_line = 1
    def __init__(self, filename:str):
        self.filename = filename

        m_cpp_path=r'C:\MinGW\bin\gcc.exe'
        m_cpp_args=['-E', r'-Iutils/fake_libc_include']
        self.ast = parse_file(filename, use_cpp = True, cpp_path=m_cpp_path, cpp_args= m_cpp_args)

        self.writeExcHander = WriterExcel(1)

    def ProcessTreeNode(self):
        for FuncDecNope in self.ast.ext:
            
            if FuncDecNope.__class__.__name__ == 'FuncDef':
                self.ProcessLine1(FuncDecNope)
                self.ProcessLine2()
                self.ProcessLine3()
                self.ProcessLine4()
                self.ProcessLine5()
                self.ProcessLine6()
                self.ProcessLine7()
                self.ProcessLine8()
                self.ProcessLine9()
                self.ProcessLine10(FuncDecNope)
                self.ProcessLine11(FuncDecNope)
                self.ProcessLine12()
                self.ProcessLine13(FuncDecNope)
                self.ProcessLine14()
                self.writeExcHander.copyfuncnum += 1

    def ProcessLine1(self, funcDef):
        """
        @ Line 1
        """
        m_declNode = funcDef.decl

        print(m_declNode.name)
        self.writeExcHander.WriteLine1(row = self.current_line, funcName= m_declNode.name)
        self.current_line += 1
        
    def ProcessLine2(self):
        """
        @ Line 2
        """
        
        self.writeExcHander.WriteLine2(row = self.current_line)
        self.current_line += 1
        
    def ProcessLine3(self):
        """
        @ Line 3
        """
        
        self.writeExcHander.WriteLine3(row = self.current_line)
        self.current_line += 1
        
    def ProcessLine4(self):
        """
        @ Line 4
        """
        
        self.writeExcHander.WriteLine4(row = self.current_line)
        self.current_line += 1
        
    def ProcessLine5(self):
        """
        @ Line 5
        """
        
        self.writeExcHander.WriteLine5(row = self.current_line)
        self.current_line += 1
        
    def ProcessLine6(self):
        """
        @ Line 6
        """
        
        self.writeExcHander.WriteLine5(row = self.current_line)
        self.current_line += 1
        
    def ProcessLine7(self):
        """
        @ Line 7
        """
        
        self.writeExcHander.WriteLine7(row = self.current_line)
        self.current_line += 1
        
    def ProcessLine8(self):
        """
        @ Line 8
        """
        
        self.writeExcHander.WriteLine8(row = self.current_line)
        self.current_line += 1
        
    def ProcessLine9(self):
        """
        @ Line 9
        """
        
        self.writeExcHander.WriteLine9(row = self.current_line)
        self.current_line += 1
        
    def ProcessLine10(self, funcDef):
        """
        @ Line 10
        """
        m_paraList = []

        para_len = len(funcDef.decl.type.args.params)
        print('para_len = ', para_len)
        for index in range(para_len):
            tmp_paraList = funcDef.decl.type.args.params[index]
            tmp_list = []
            if tmp_paraList.name != 'None':
                tmp_list.append(tmp_paraList.name)
                tmp_list.append(tmp_paraList.type.type.names[0])
            m_paraList.append(tmp_list)

        self.writeExcHander.WriteLine10(row = self.current_line, paraList= m_paraList)

        if len(m_paraList) > 1:
            self.current_line += len(m_paraList)
        else:
            self.current_line += 1
        
    def ProcessLine11(self, funcDef):
        """
        @ Line 11
        """
        m_retList = []

        m_blockItem = funcDef.body.block_items

        m_tmpList = []
        for eachNode in m_blockItem:
            m_tmpList.append(eachNode.__class__.__name__)

        if 'Return' not in m_tmpList :
            print('不在')
            self.writeExcHander.WriteLine11(row = self.current_line, retList= m_retList)
            self.current_line += 1
            return

        for eachNode in m_blockItem:
            if eachNode.__class__.__name__ == 'Return':
                if eachNode.expr.__class__.__name__ == 'Constant':
                    m_retList.append(eachNode.expr.value)
                    m_retList.append(funcDef.decl.type.type.type.names[0])
                elif eachNode.expr.__class__.__name__ == 'BinaryOp':
                    if eachNode.expr.op == '-':
                        m_retList.append(eachNode.expr.left.name + eachNode.expr.op + eachNode.expr.right.name)
                        m_retList.append(funcDef.decl.type.type.type.names[0])
        

        self.writeExcHander.WriteLine11(row = self.current_line, retList= m_retList)

        self.current_line += 1
        
    def ProcessLine12(self):
        """
        @ Line 12
        """
        self.writeExcHander.WriteLine12(row = self.current_line)
        self.current_line += 1

    def ProcessLine13(self, funcDef):
        """
        @ Line 13
        """
        self.writeExcHander.WriteLine13(row = self.current_line, fileName= funcDef.coord.file)
        self.current_line += 1

    def ProcessLine14(self):
        """
        @ Line 14
        """
        self.writeExcHander.WriteLine14(row = self.current_line)
        self.current_line += 1

    def SaveExtToTxt(self):
        with open('ast.txt', encoding='utf-8', mode= 'w+') as f:
            f.write(str(self.ast.ext))


def main():

    m_filename = 'test.c'
    m_fileInfo = CParserInfo(m_filename)
    m_fileInfo.ProcessTreeNode()
    m_fileInfo.SaveExtToTxt()

    m_fileInfo.writeExcHander.SaveAll()

if __name__ == '__main__'        :
    main()

4. 模板.xlsx

在这里插入图片描述

5. output.xlsx

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/874137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

@Param详解

文章目录 背景什么是ParamParam的使用方法使用方法&#xff1a;遇到的问题及因Param解决了什么问题使用与不使用对比 Param是如何进行映射的总结 背景 最近在开发过程中&#xff0c;在写mapper接口是在参数前加了Param注解&#xff0c;但是在运行的时候就会报错&#xff0c;说…

Elasticsearch 8.X 复杂分词搞不定,怎么办?

1、实战问题 球友提问&#xff1a;我想停用所有纯数字的分词 &#xff0c; 官网上的这个方法好像对ik分词器无效&#xff01; 有没有什么别的方法啊&#xff0c; chart gpt 说分词可以用正则匹配 但是测试好像是不行的 我的es版本是 8.5.3。 2、进一步沟通后&#xff0c;得…

若依框架浅浅介绍

由若依官网所给介绍可知 1、文件结构介绍 在ruoyi-admin的pom.xml文件中引入了ruoyi-framework、ruoyi-quartz和ruoyi-generatior模块&#xff0c;在ruoyi-framework的pom.xml文件中引入了ruoyi-system模块。 2、技术栈介绍 前端&#xff1a;Vue、Element UI后端&#xff1a…

Netty:在一个ByteBuf中寻找另外一个ByteBuf出现的位置

说明 利用ByteBufUtil的indexOf(ByteBuf needle, ByteBuf haystack)函数可以在haystack中寻找needle出现的位置。如果没有找到&#xff0c;返回-1。 示例 在一个ByteBuf 中找到了另外一个ByteBuf package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.…

AUTOSAR规范与ECU软件开发(基础篇)2.5 AUTOSAR方法论

前言 AUTOSAR方法论(AUTOSAR Methodology) 中车用控制器软件的开发涉及系统级、 ECU级和软件组件级。 系统级主要考虑系统功能需求、 硬件资源、 系统约束, 然后建立系统架构; ECU级根据抽象后的信息对ECU进行配置; 系统级和ECU级设计的同时, 伴随着软件组件级的开发。 上…

python软件安装包百度云,python软件安装教程2020

大家好&#xff0c;小编为大家解答python软件安装在哪个盘比较好的问题。很多人还不知道python软件安装过程中,customize&#xff0c;现在让我们一起来看看吧&#xff01; 一&#xff1a;python安装 安装软件的路径中不允许出现中文、带空格的字符串、特殊符号、纯数字&#xf…

n-皇后问题

希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不能错过的模板大全…

面试热题(最大子数组和)

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;6 解释&#xff1a;连续…

Creo结构设计-创建ASM装配工程以及零件协调配合绘图

问题描述 在结构设计时&#xff0c;往往包含了多个组件&#xff0c;各个组件需要分开设计&#xff0c;但同时需要借鉴上一个模块的尺寸信息&#xff0c;如果创建多个零件&#xff0c;最后再组合那么会降低效率&#xff0c;那么有什么好的解决方式&#xff0c;能够再一个工程里…

代码随想录算法训练营之JAVA|第二十七天| 455. 分发饼干

今天是第27天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 455. 分发饼干https://leetcode.cn/problems/assign-cookies/ 第一想法 题目理解&#xff1a;G个人分 S块饼干 要求饼干大于或者等于人的肚量。 第一想法&#xff1a;将人按照肚量从小到达…

PyQt5的信号与槽函数

目录 一、介绍 二、一个信号连接一个槽 三、一个信号连接多个槽 四、多个信号连接一个槽 五、自定义信号 1、创建自定义信号 2、让自定义信号携带值 一、介绍 在下图中 &#xff08;1&#xff09;widget就是PyQt中的控件对象。其实就是组件&#xff08;2&#xff09;…

教育行业文件协作的最佳实践分享!

在教育工作中&#xff0c;经常需要进行文件协作&#xff0c;无论是师生间还是老师与老师之间。目前最常用的文件协作方式就是通过社交工具或者邮件进行文件共享。 这种协作方式的缺点 1、大文件传输不便&#xff1a;这种协作方式依托于社交工具&#xff0c;对于大文件传输并不…

YOLOV8/YOLOv7/YOLOv5改进:引入GAMAttention注意力机制

为了提高各种计算机视觉任务的性能&#xff0c;人们研究了各种注意机制。然而&#xff0c;以往的方法忽略了保留通道和空间方面的信息以增强跨维度交互的重要性。因此&#xff0c;我们提出了一种全局调度机制&#xff0c;通过减少信息缩减和放大全局交互表示来提高深度神经网络…

6914. 翻倍以链表形式表示的数字

题目描述&#xff1a; 给你一个 非空 链表的头节点 head &#xff0c;表示一个不含前导零的非负数整数。 将链表 翻倍 后&#xff0c;返回头节点 head 。 示例&#xff1a; 解题思路&#xff1a; 先计算第一位是否超出位数&#xff0c;超出新建存储该数值&#xff0c;再逐个翻倍…

JZ34二叉树中和为某一值的路径

题目地址&#xff1a;二叉树中和为某一值的路径(二)_牛客题霸_牛客网 题目回顾&#xff1a; 解题思路&#xff1a; 这里求的是和为某一值的路径&#xff0c;要用dfs算法&#xff0c;也就是说这里使用深度优先搜索算法。 从根节点开始向左右子树进行递归操作&#xff0c;在递…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK设置相机固定帧…

ORCA优化器浅析——CDXLScalarFilter Class for DXL filter operators

CDXLScalarFilter CDXLScalarFilter为Class for representing DXL filter operators。CDXLScalarFilter相对于CDXLScalar没有增加其他数据成员。 class CDXLScalarFilter : public CDXLScalar{ private: CDXLScalarFilter(CDXLScalarFilter &); // private copy ctor pub…

初识C语言(3)

什么是C语言 1.第一个C语言程序 2.数据类型 3.变量、常量 4.字符串转义字符注释 5.选择语句 6.循环语句 7.函数 8.数组 9.操作符 10.常见关键字 11.define 定义常量和宏 12.指针 13.结构体 这一篇文章我们从常见关键字开始说起&#xff0c;也是…

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)

1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

2023年国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …