Python 解析c文件并导出到Excel

news/2024/7/21 4:10:53 标签: python, excel, openpyxl, cparser

文章目录

  • 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;
}

excelpy_48">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)

cparserpy_258">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.niftyadmin.cn/n/4938891.html

相关文章

如何将阿里云WiredTiger引擎的MongoDB物理备份文件恢复至自建数据库

数据库操作一直是一个比较敏感的话题&#xff0c;动不动“删库跑路”&#xff0c;可见数据库操作对于一个项目而言是非常重要的&#xff0c;我们有时候会因为一个游戏的严重bug或者运营故障要回档数据库&#xff0c;而你们刚好使用的是阿里云的Mongodb&#xff0c;那么这篇文章…

ChatGPT or BingChat

你相信我们对大模型也存在「迷信权威」吗&#xff1f; ChatGPT 的 GPT-4 名声在外&#xff0c;我们就不自觉地更相信它&#xff0c;优先使用它。但我用 ChatALL 比较 AI 大模型们这么久&#xff0c;得到的结论是&#xff1a; ChatGPT GPT-4 在大多数情况下确实是最强&#xf…

Unity实现异步加载场景

一&#xff1a;创建UGUI 首先我们在LoginCanvas登入面板下面创建一个Panel,取名为LoadScreen,再在loadScreen下面创建一个Image组件&#xff0c;放置背景图片&#xff0c;然后我们再在lpadScreen下面继续创建一个Slider,这个是用来加载进度条的&#xff0c;我们改名为LoadSlid…

git 配置网络代理

提高 git 访问 github 速度 网络代理前提: 请开启代理&#xff08;梯子&#xff09;检查代理端口&#xff08;可能会有所不同&#xff09; 文章目录 1. git 配置参数列表命令&#xff1a;2. git 添加 http 代理3. git 取消 http 代理 1. git 配置参数列表命令&#xff1a; gi…

React Native Expo项目,复制文本到剪切板

装包&#xff1a; npx expo install expo-clipboard import * as Clipboard from expo-clipboardconst handleCopy async (text) > {await Clipboard.setStringAsync(text)Toast.show(复制成功, {duration: 3000,position: Toast.positions.CENTER,})} 参考链接&#xff1a…

9.3.2.2网络原理(传输层TCP)

TCP全部细节参考RFC标准文档 一.TCP特点: 有连接,可靠传输,面向字节流,全双工. 二.TCP数据报: 1.端口号是传输层的重要概念. 2.TCP的报头是变长的(UDP是固定的8字节),大小存在4位首部长度中,用4个bit位(0~15)表示长度单位是4字节.(TCP报头最大长度是60字节,前面20字节是固定…

智慧工地源码,互联网+建筑工地,基于微服务+Java+Spring Cloud +Vue+UniApp开发

基于微服务JavaSpring Cloud VueUniApp MySql开发的智慧工地云平台源码 智慧工地概念&#xff1a; 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;然后以物联网、移动互联网技术为基础&#xff0c;充分应用BIM、大数据、人工智能、移…

java # Servlet

一、什么是Servlet&#xff1f; Servlet是javaEE规范之一。规范就是接口。JavaWeb三大组件分别是&#xff1a;Servlet程序、Filter过滤器、Listener监听器。Servlet是运行在服务器上的一个Java小程序&#xff0c;它可以接收客户端发送来的请求&#xff0c;并响应数据给客户端。…