Python统计代码行数的实现方法与逻辑解析

Elena
Elena
发布时间:2026-10-13| 2人浏览过
原创

本文详细介绍使用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程序设计有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。