前言
工作中,有时需要发布无任何注释的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)