Python统计代码行数的实现方法与逻辑解析
本文详细介绍使用Python统计指定目录下代码行数的方法。通过遍历文件、识别后缀名,并逐行读取判断代码、注释及空行,实现自动化统计。文章解析了处理单行与多行注释的逻辑,提供完整示例代码,帮助开发者高效掌握代码量统计技巧。
本文介绍了一种使用Python统计代码行数的具体实现方案,供读者参考学习。
在光荣之路测试开发班的三个月学习中,吴总经常询问大家实践编写了多少行代码。面对这一问题,许多人可能感到困惑。手动逐个文件统计显然效率低下,因此我们应利用代码自动完成这一任务。近期在刷题时遇到类似题目,遂决定编写相关程序进行实践。
题目要求:给定一个包含个人编写程序的目录,统计其中的代码总行数。统计范围需包含空行和注释,且需分别列出各类别的具体数量。
首先梳理整体思路,从指定目录统计代码行数的过程大致可分为以下7个步骤:
1. 遍历指定目录下的所有文件。 2. 筛选以“.py”为后缀的文件(以Python代码为例)。 3. 以只读模式打开.py文件(注意避免使用W+模式,以免清空文件内容)。 4. 循环读取文件中的每一行。 5. 对每一行内容进行分类判断: (a) 单行注释:以#开头。 (b) 多行注释:以三引号(单引号或双引号)开头并结束。 (c) 空行:仅包含空白字符,无其他内容。 (d) 有效代码行:去除空白字符后仍包含其他字符。 6. 判断是否到达文件末尾。 7. 关闭文件,返回统计结果。
明确解题思路后,只需将各模块代码像搭积木一样组合即可(完整示例代码见文末)。
5~9行:导入os模块,定义code_lines_count函数并接收path参数,声明三个变量分别用于统计代码行、注释行和空行的数量。 10~13行:遍历os.walk获取的文件对象,利用splitext函数分割文件后缀名,并通过列表索引[1]获取后缀名,判断是否以“.py”结尾。(此处也可使用listdir,但listdir仅能获取单层目录文件,且需单独判断元素是文件还是文件夹,较为繁琐) 第12行定义file_abs_path变量并赋值为文件绝对路径,因后续代码多次使用,避免重复调用os.path.join(xx, xx)。 14~18行:对筛选出的.py文件,使用with语句打开(可自动处理文件关闭),通过While True循环调用readline()逐行读取文件内容并赋值给line变量。 19~39行:对readline()获取的行进行分类判断,区分代码行、空行或注释行。 19~21行:若line为空,表示到达文件末尾,此时break退出while循环,继续处理files列表中的下一个文件。 22~24行:使用strip()去除line的空白字符,若处理后以“#”开头,则判定为注释行,对comm_lines加1。 25~33行:使用strip()去除line的空白字符,若处理后以三个单引号或三个双引号开头,则判定为多行注释开始。判断该行三引号数量,若为1则表示注释跨越多行,否则为一行注释(一对三引号在同一行)。对于多行注释情况,使用while循环读取后续行,每读一行对comm_lines加1,直到某行存在三引号判定注释结束,break退出当前while循环(此处仅考虑规范注释)。 34~36行:若读取的行经strip()处理后非空且非注释,则判定为代码行,对code_lines加1。 37~39行:若上述条件均不满足,则判定为空行,对space_lines加1。 41行:返回统计到的代码行、注释行和空行数量。 43行:测试代码,运行实例见下图。

#_*_coding:utf-8_*_
# 统计代码行数, 空行, 注释.
import os
def code_lines_count(path):
code_lines = 0
comm_lines = 0
space_lines = 0
for root,dirs,files in os.walk(path):
for item in files:
file_abs_path = os.path.join(root,item)
postfix = os.path.splitext(file_abs_path)[1]
if postfix == '.py':
#print 'Start: ',file_abs_path
with open(file_abs_path) as fp:
while True:
line = fp.readline()
if not line:
#print 'break here,%r' %line
break
elif line.strip().startswith('#'):
#print '1, here',line
comm_lines += 1
elif line.strip().startswith("'''") or line.strip().startswith('"""'):
comm_lines += 1
if line.count('"""') ==1 or line.count("'''") ==1:
while True:
line = fp.readline()
#print '4, here',line
comm_lines += 1
if ("'''" in line) or ('"""' in line):
break
elif line.strip():
#print '5, here',line
code_lines += 1
else:
#print '6, here',line
space_lines +=1
#print 'Done',file_abs_path
return code_lines,comm_lines,space_lines
#test
print "Code lines: %d\nComments lines: %d\nWhiteSpace lines: %d" %code_lines_count(r'D:\exercises')
编写代码本质与打游戏类似,都是打怪升级、获取装备的过程。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。
希望本文所述内容对大家学习Python程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













