Python实践:一个指令删除C代码全部注释

前言


工作中,有时需要发布无任何注释的CleanCode,但每次手动删除注释都比较麻烦,于是有了一个想法:用Python实现一个功能函数,实现一个调用即可删除C代码的全部注释。

解决思路


思路

  • 查找每行的内容是否含有 ///*
  • 若含有 // ,则将之往后的所有内容删除
  • 若含有 /*,则判断当前行是否有 */
    • 如有,则删除当前行区间 /* */里的内容,并判断余下的内容是否为空或全空格
    • 如无,则删除/*以后的数据,并继续读取下一行,直到匹配到 */
  • 遍历到文件末尾结束

所需知识点

  • 文本文件读写操作
  • 字符串分割
  • 子字符串查找
  • 列表操作

功能实现


  • 输入: 输入输出的文件路径和文件名
  • 输出: 生成删除注释后的文本文件
  • 注意: 需保证输入为C代码,且注释语法正确

实现代码如下:

import os

def del_comment_c(in_dir, in_fname, out_dir, out_fname):
    in_path = os.path.join(in_dir, in_fname)
    out_path = os.path.join(out_dir, out_fname)
    f_in = open(in_path, "r", encoding='UTF-8')
    write_buf = []
    line = f_in.readline()
    slash_flag = 0
    while line:
        line = line.split("\n")[0]
        if line.find("//") >= 0:
            p = line.split("//")[0]  ## 存在返回起始坐标,从0开始,不存在,则返回-1
            if p != "" and (p.isspace() != True):
                write_buf.append(p)
        elif line.find("/*") >= 0 and line.find("*/") >= 0: 
            p = line.split("/*")[0]
            if p != "" and (p.isspace() != True): ## 排除只剩全空格或为空
                write_buf.append(p)
            p = line.split("*/")[-1]
            if p != "":
                write_buf.append(p)
        elif line.find("/*") >= 0:
            p = line.split("/*")[0]
            if p != "":
                write_buf.append(p)
            slash_flag = 1
        elif line.find("*/") >= 0:
            p = line.split("*/")[-1]
            if p != "" and p != "\n":
                write_buf.append(p)
            slash_flag = 0
        elif slash_flag == 1:
            line = f_in.readline()
            continue
        else:
            write_buf.append(line)       
        line = f_in.readline()
    
    f_out = open(out_path, "w")
    f_out.write('\n'.join(write_buf))
    f_out.close()
    f_in.close()
    return

主调demo


if __name__ == '__main__':
    in_dir = r"D:\MyCode\demo_c_py"
    in_fname = r"test_del_comment.c"
    out_dir = r"D:\MyCode\demo_c_py\output"
    out_fname = r"test_del_comment_after.c"
    del_comment_c(in_dir, in_fname, out_dir, out_fname)