Python实现的一个代码分析功能
主要实现的功能: 1.单页、总行数代码统计 2.单页、总行数注释统计 3.代码注释率、总注释率统计 4.根据注释率/注释行数/代码行数进行排序 5.根据注释方式 “//” “<!---->” “#” “/***/” 进行注释分析 -> 暂时只有这些
-
题外话 Python的基础语法很好学,难在各种模块的使用上,而Python的强大之处正在于这些模块上,任重而道远。
-
本来呢,是想用PyQt5去写一个可执行文件的,毕竟我是做Android的还是希望我的代码能有一个好看的UI的,看了PyQt5的文档放弃了,还是需要时间去学习它的用法的(= =。废话),而我现在没时间去学,以后再说吧~
-
用的是Android的源码做的例子,这个注释比例还是很高的(防止类重名统计失去准确度用了文件夹/文件去命名)。
QQ截图20170907195035.png
-
说下过程吧
1,遍历文件夹
# 开始 traverse_files(root) print("总行数", code_num, '注释行数', code_annotation_num, '注释比例', str(int(round(code_annotation_num / code_num, 2) * 100)) + "%") print("===================") print("===================") print("===================") print("===================") print("===================") # print(error_file_lst) for item in file_list: print(item[0], "文件行数:%s" % item[1][0], "注释行数:%s" % item[1][1], "注释比例:%s" % item[1][2] )
traverse_files是一个递归函数,像这样,过滤文件后缀以及循环文件夹。
for i in os.listdir(path): file_path = os.path.join(path, i) if os.path.isfile(file_path): if len(need_suffix) != 0: for suffix in need_suffix: if suffix in file_path: print_line(file_path) else: print_line(file_path) else: traverse_files(os.path.join(path, i))
2,读取文件
try: with open(root_path, 'r', encoding=encoding) as lineFile: block_list = lineFile.readlines() # 已经被/****/以及<!-- -->注释的 里面的所有数据不在算做注释行 annotation_line_lst = [] # 读取每一行 放到集合中 if len(annotation_list) > 0: annotation_line = 0 for index, block_line in enumerate(block_list): block_line = block_line.replace('\t', '').replace('\n', '').replace(' ', '') try: is_reset_loop = False for tuple_line in annotation_line_lst: if index in tuple_line: is_reset_loop = True break if is_reset_loop: continue # Python if dl.Python in annotation_list: if block_line.find("#") != -1: annotation_line += 1 # 通用 java 还有 html 都有这样的注释 if dl.Java in annotation_list \ or dl.HTML in annotation_list: if block_line[0:4] == '<!--': for i, line in enumerate(block_list[index:]): line = line.replace('\t', '').replace('\n', '').replace(' ', '') # 判断 --> 是否是本行的最后一行 if "-->" in line and '-->' == line[-3:]: annotation_line_temp = i + 1 annotation_line += annotation_line_temp annotation_line_lst.append(range(index, index + annotation_line_temp)) break if dl.Java in annotation_list: if block_line[0] == '/' and block_line[1] == '/': annotation_line += 1 if block_line[0] == '/' and block_line[1] == '*': for i, line in enumerate(block_list[index:]): line = line.replace('\t', '').replace('\n', '').replace(' ', '') if "*/" in line and "*/" == line[-2:]: annotation_line_temp = i + 1 annotation_line += annotation_line_temp annotation_line_lst.append(range(index, index + annotation_line_temp)) break except Exception as e: pass if is_fliter_none_line: block_list_copy = [] for item in block_list: if item.split(): block_list_copy.append(item) block_list = block_list_copy # 将单个文件的信息保存起来 print_message(root_path.split(os.sep)[-2:], numline=len(block_list), annotation_line=annotation_line) global code_num code_num += len(block_list) except UnicodeDecodeError as e: error_file_lst.append(root_path) pass
3,统计
def print_message(filename, **kwargs): line_num = kwargs["numline"] annotation_num = kwargs['annotation_line'] global code_annotation_num code_annotation_num += annotation_num annotation_proportion = str(int(round(annotation_num / line_num, 2) * 100)) + "%" file_dict[filename[0] + os.sep + filename[1]] = [line_num, annotation_num, annotation_proportion] global file_list # 重新排序 file_list = sorted(file_dict.items(), key=lambda b: b[1][0], reverse=True)
Python很有趣
玩的很开心啊,哈哈哈哈
源码有点烂没好意思全贴,想要的跟我说我贴上来。。。
或者我优化优化在贴上来啊,哈哈哈哈哈哈
原文地址:https://www.jianshu.com/p/34f327743169
相关推荐
-
Python:从闭包到装饰器 python基础
2018-10-30
-
使用 Python 学习和破解古典密码 python基础
2019-8-25
-
pip设置镜像 python基础
2019-8-25
-
ARIMA时间序列分析 python基础
2019-8-29
-
分析了16年的福利彩票记录,原来可以用Python这么买彩票 python基础
2019-9-3
-
Python 工具——Anaconda+Pycharm 的安装过程 python基础
2019-3-6
-
Anaconda管理Python python基础
2019-8-26
-
xweb: 一款无依赖的python web框架(低于500行代码) python基础
2019-4-27
-
Pandas 下标存取操作 python基础
2019-8-29
-
Python中的魔法函数总结整理 python基础
2019-9-14