python使用os.walk()统计代码行数需按扩展名筛选目标文件(如.py、.js等),逐行扫描跳过空行、单行注释及三引号字符串块内行,用状态机维护in_triple_quote避免误判,兼顾编码容错与二进制文件异常处理。

用 os.walk() 遍历目录,但别直接统计空行和注释
直接对所有文件调用 len(file.readlines()) 会把空行、注释、多行字符串都算进去,结果严重偏高。真实需求通常是“有效代码行数”,得按语言规则过滤。比如 Python 文件里以 # 开头的单行注释、""" 包裹的文档字符串、空行都不该计入。
- 先按扩展名筛选目标文件:
['.py', '.js', '.ts', '.java', '.cpp', '.c'],跳过.pyc、.git目录等 - 对每种语言写轻量级判断逻辑,例如 Python 文件中跳过以
#开头、纯空白、或处于三引号字符串块内的行 - 不要用正则暴力匹配整行——遇到嵌套引号或转义容易误判;用状态机式逐行扫描更稳
Python 文件行数统计:避开 ast 解析的性能坑
ast.parse() 能精准识别语法结构,但对大项目(比如上千个 .py 文件)会明显拖慢速度,且无法处理语法错误的临时代码。实际中推荐用行首特征快速过滤:
- 跳过空白行:
line.strip() == '' - 跳过单行注释:
line.strip().startswith('#') - 跳过多行字符串起始/结束行(需维护一个
in_triple_quote状态变量) - 不处理缩进、装饰器、import 行——这些都属于有效代码行
示例片段:
in_triple = False
for line in f:
stripped = line.strip()
if stripped.startswith('"""') or stripped.startswith("'''"):
in_triple = not in_triple
continue
if in_triple or not stripped or stripped.startswith('#'):
continue
count += 1
跨语言统一统计时,注意 line ending 和编码问题
Windows 的 \r\n、macOS 的 \n、旧 Mac 的 \r 都会影响 readlines() 行数。更麻烦的是编码:UTF-8 with BOM、GBK、ISO-8859-1 混在同一个项目里很常见。
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 打开文件时强制指定
encoding='utf-8',捕获UnicodeDecodeError后 fallback 到errors='ignore'或尝试chardet检测(但别在循环里实时调用,太慢) - 用
line.rstrip('\r\n')而不是line.strip()避免误删行尾有意义的空格 - Git 仓库里常见
.gitattributes设置* text=auto,但统计脚本不能依赖 Git 配置
命令行快速估算:别写脚本,先用 find + wc
开发初期只想粗略看总量?Shell 一行比 Python 脚本快得多,尤其对小项目:
- Python 文件总行数:
find . -name "*.py" -not -path "./venv/*" -not -path "./.git/*" | xargs wc -l - 排除空行和注释(简单版):
find . -name "*.py" | xargs grep -v "^[[:space:]]*$\|^[[:space:]]*#" | wc -l - 注意
grep不处理多行字符串,仅作参考;且路径含空格时需加-print0和-0参数
真正要嵌入 CI 或生成报告,才值得写带语言感知的 Python 版本——否则多数时候,grep 就够用了。
最易被忽略的是二进制文件误读:PDF、图片、编译产物混在源码目录时,open() 会抛异常或读出乱码行。务必在 try/except 中跳过,并记录警告而非中断整个遍历。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










