用代码统计代码文件(python)

时间:2022-01-02 10:56:17

需求说明:把我们自己写的代码放在一个文件夹里,写一个python程序来统计这个文件夹里一共有多少行代码,包括空行注释行,并把相应信息分别列出来。


方案:

我们把这个任务分解成几个小任务:

1、获取要进行统计的代码文件的文件名列表。

2、对列表里面的每一个代码文件进行各类代码行进行统计。

3、计算并输出整体统计结果。

进一步,我们可以将上面的任务细分成更小的任务:

1.1 获取目标文件夹下面的文件名,放在一个列表里。

1.2 从1.1中得到的列表里过滤出目标代码文件。


2.1 读取单个文件获得一个文本流。

2.2 计算文本流里面的空行数(计算总行数很简单,不用单说了)。

2.3 计算文本流里面的注释行数。

【注意】对于python代码来说,有单行注释(用#号打头)和多行注释(用triple quote即"""或'''打头,并用triple quote结尾)。

对于任务3就不再细分了。


然后再用代码实现上面每一个小任务。

对于1.1,我们可用os模块的BIF listdir,返回一个给定目录下每一个条目的名字(不包含路径信息,并且不包含'.''..')。由于给定目录下面可能含有子目录,所以我们要判断每一个条目是否是文件,如果是就放入列表,否则忽略(如果要深入子目录,可以考虑用os.walk)。

代码实现如下:

import os

file_list = [f for f in os.listdir(target_path)
if os.path.isfile(os.path.join(target_path, f))]
采用列表推导生成一个目标列表。

对于1.2,由于python代码一般以.py作为扩展名,所以通过判断文件名字符串的最后三个字符来筛选出python代码文件,同样也可以用列表推导:

pyfile_list = [os.path.join(target_path, f) for f in file_list
if f[-3:] == '.py']

对于2.1,我们使用简单的文件IO函数open即可。

对于2.2,分析空行的特征,就是把这一行的字符串首位的空白符都去掉后就成了一个空字符串了''。

对于2.3,同样分析特征,单行注释就是把这一行的字符串首位的空白符都去掉后就成了一个以#号开头的字符串;多行注释要麻烦一点,我们统计文本流时采用For循环遍历每一行代码,统计多行注释的时候就需要有一个整体的概念,即发现一处多行注释时就要开始计数,一直到发现结束标志完。

考虑到代码可重用性,我们可以设计一个类,专门用来统计python代码文件。

对于整个任务2,实现代码如下:

class PyfileInfo:

def __init__(self, file):
self.file_name = file
self.total_line_num = 0
self.blank_line_num = 0
self.comment_line_num = 0

def count_lines(self):
if self.file_name[-3:] != '.py':
print(self.file_name + ' is not a .py file!')
return
mc_flag = False
try:
with open(self.file_name) as code:
for each_line in code:
self.total_line_num += 1
temp = each_line.strip()
if temp == '':
self.blank_line_num += 1
elif temp[0] == '#':
self.comment_line_num += 1
else:
if False == mc_flag:
if temp[0:3] == '"""':
mc_flag = True
elif temp[-3:] == '"""':
mc_flag = False
self.comment_line_num += 1
if mc_flag:
self.comment_line_num += 1
except IOError as err:
print('File error: ' + str(err))

对于任务3,我们可以用一个for循环遍历1.2得到的列表,为每一个.py文件创建一个PyfileInfo类实例,即可统计出总行数,总的空行数,总的注释行数。对于输出统计结果,还要在PyfileInfo类里添加一个display方法。

整个代码实现可参见count_codes.py文件。


废话少说,展示一下测试结果:(更新在ubuntu系统上,用python3执行目标文件夹

用代码统计代码文件(python)

用代码统计代码文件(python)


写在后面:

本文旨在用简单的代码去实现看起来不简单的任务,也就没有用到python里re模块的正则查找,

其他语言的代码特征我不熟悉,可能需要用到功能更强大的正则表达式工具。


作为一个工具,我们还可以设计一个友好交互,即目标文件夹信息可由用户输入:

print('Please input a path which include some .py files.')
target_path = input("@> ")

仔细分析并测试count_codes.py代码,会发现还有bug:

1、如果多行注释里面存在空行会怎么样?

2、如果一行代码以"""开头并且以"""结尾又会怎么样?

对python编程感兴趣的同学可以自己去探索一下用代码统计代码文件(python),欢迎pythoner指出新发现的bug。