HandyTools Hub

行数统计

统计行数、检测注释并分析您的文本或代码

100% 客户端处理

行统计

指标 计数 百分比
总行数 0 -
代码行 0 -
注释行 0 -
空行 0 -
非空行 0 -
最大行长度 0 -
平均行长度 0 -

这个行数计数器把任意粘贴进来的文本或源代码拆分为总行数、空行、注释行和真正的代码行,并给出最长行与平均行长。它适合快速评估文件规模的开发者、检查文档结构的写作者,以及任何需要比简单字数统计更细致信息的人。所有内容随输入实时更新,并只停留在你的机器上。

各项指标如何计算

指标定义
总行数统一换行符并移除一个末尾换行之后的行数
非空行去除首尾空白后至少含一个字符的行(开启去空白时)
空行总行数减去非空行
注释行第一个非空白字符匹配注释标记的行
代码行非空行减去注释行
最长 / 平均行长基于非空行计算,如启用则先去除首尾空白

由于代码行、注释行和空行都从同一个非空计数推导而来,它们相加始终等于总数,不存在重复计算。

实操示例:一个简短的 Python 文件

在开启去空白和注释识别的情况下粘贴这九行片段:

import math

# circle area
def area(r):
    return math.pi * r * r

# --- test ---
if __name__ == "__main__":
    print(area(2))

统计表会报告:

  • 总行数: 9
  • 非空行: 7(第 2、6 两个空行被排除)
  • 空行: 2
  • 注释行: 2(# circle area 和 # --- test ---)
  • 代码行: 5
  • 最长行长: 26(if __name__ == "__main__":)
  • 平均行长: 16.0

如果你启用「去除空白」,带缩进的 return 行会去掉四个前导空格再测量,这就是平均值落在 16.0 而不是更高的原因。

注释识别规则与盲区

这刻意采用一种快速的行前缀启发式,而不是解析器。这让它无需配置就能跨语言使用,但也存在已知盲区:

  • 只检查行首。 x = 1; // set x 是代码,/* ... */ 中开括号位于行中间的块也一样。
  • C 预处理器指令会误判。 #include <stdio.h> 以 # 开头,会被算作注释,尽管它是代码。
  • 指针运算会误判。 C 中以 *ptr = 5; 开头的行匹配 * 注释规则而被算作注释,而 */ 风格的收尾却不会被识别。
  • Shell 参数会误判。 以 --verbose 开头的行会被算作注释,因为 -- 是 SQL/Lua 的标记。
  • 块注释不跨行跟踪。 只有带标记的行才被计数;一个多行块贡献的注释行数等于它带标记的行数,而不是它跨越的行数。

把计数当作信号,而不是审计。针对特定语言,静态分析器总归更精确。

换行符与末尾换行边界情况

来自 Windows 的文件带 CRLF 结尾,来自旧式 Mac 的文件带单独的 CR,Unix 工具则用 LF。计数器先把三者统一为 LF,所以不同来源的行数彼此吻合。随后它恰好移除一个末尾换行:"a\nb\n" 计为 2 行而不是 3 行,而 "a\nb\n\n" 计为 3 行并带一个空行。空输入返回全零,而不是报错。如果关闭去空白,一行纯空格不再算作空行,会连同填充空格一起计入行长统计。

行数能说明什么、不能说明什么

代码行数(LOC)是最古老的软件度量之一,也是被误用最多的指标之一。原始总数描述的是规模,而非质量:一个精炼优雅的函数和一个臃肿的函数可以完成同样的工作,行数却差很远;用 LOC 排名开发者产出更是出了名的适得其反——它奖励啰嗦,惩罚那些删除冗余代码的重构。

行数细分真正有价值的地方,在于刻画一个代码库。注释比例高,通常说明代码有良好文档——也可能是过时的注释。最长行很长,往往提示格式上的欠债。空行比例意外上升,可能暴露了生成或机器合并产出的文件。对散文和数据而言,同样的数字能回答实际问题:这份日志有没有空行?我的数据集是不是一行一条记录?我的行长是否一致?本工具无需搭建静态分析套件,就能立刻给你这些信号。

实用技巧

  • 在重构前后比较同一个文件。 粘贴旧版本,记下代码行和注释行,再粘贴新版本。代码行变少而注释数不变,通常意味着真正的简化;注释行下降则是警告,而不是胜利。
  • 强制列宽上限。 如果项目把行宽限制在 80 或 100 个字符,最长行长会立刻显示是否有内容越界,平均值则告诉你文件其余部分还有多少余量。
  • 用空行百分比审查数据和日志。 格式良好的 CSV 应包含零个空行,而分块导出的日志常常多出空行分隔符。意外的空行占比能在数据进入数据库之前发现畸形的导出。
  • 绝不用代码行比较语言或人。 Python 用十行表达的东西,Java 可能要写三十行。用计数追踪单个文件或项目随时间的变化,而不是给语言或开发者排名。

相关工具

  • 字数统计 —— 统计字数、字符数、句子数和阅读时间。
  • 文本统计 —— 获取粘贴文本更全面的拆分。
  • 差异对比 —— 逐行比较两个版本。

常见问题

什么算作注释行?

一行中第一个非空白字符是 `//`、`#`、`--`、`<!--`、`/*`,或 `*`(且后面不跟 `/`)时,会被当作注释。这覆盖了 JavaScript、C、Java、Python、Ruby、Bash、SQL、Lua、HTML 和 CSS 风格的注释。

它如何处理混合换行符?

支持。统计前会把 CRLF(Windows)和 CR(旧式 Mac)统一成 LF(Unix),所以同一个文件无论由什么工具生成,行数都一致。末尾的单个换行会被丢弃,而不会多算一个空行。

可以统计空行吗?

可以。空行会单独报告,既有数量也有占总数百分比。开启去除空白后,只含空格或制表符的行也会算作空行。

像 `x = 1; // set x` 这样的行会被算作注释吗?

不会。识别只检查行首,所以行尾的行内注释不会让整行变成注释,它仍被算作代码行。只有以注释标记开头的行才被归类为注释。

末尾换行会让行数多出一行吗?

不会。拆分前会先移除一个末尾换行,所以以换行结尾的文件和不以换行结尾的文件计数相同。两个末尾换行会留下一个真实的空行计入统计。

关闭「去除空白」后会发生什么变化?

行长统计会改为测量包含首尾空白的原始行,只含空白的行不再算作空行,而是算作非空行。当你要测量的正是缩进宽度时,关闭它会更有用。

由 HandyTools Hub 团队审校 · 最后更新