26软件技术基础/第二次作业/10.29/廖原
| 这个作业属于哪个课程 | 26软件技术基础 (浙江理工大学) |
|---|---|
| 这个作业的目标 | 实现命令行文本计数统计程序;了解并完成单元测试、性能分析;了解git与gitee的使用 |
| 姓名-学号 | 廖原-2024329301040 |
码云仓库地址:https://gitee.com/komeijimu/wc_word-count
wc_word-count
一个用 Python 实现的命令行文本计数工具。它能统计纯英文 txt 文件的字符数、单词数和句子数,也支持按 Python 注释规则统计源码的代码行、空行和注释行。
项目刻意把统计逻辑与命令行解析分离:counter.py 和 line_counter.py 是纯函数模块,不读文件、不碰 argv,因此可以被单元测试直接调用;wc.py 只负责参数解析、读文件和输出。这种分层让规则变更(例如 v0.3 把注释规则收敛为仅识别 Python #)只影响一个模块,测试和文档同步范围可控。
版本
v0.1 空项目
初始化仓库,建立 README 和 .gitignore,作为版本迭代起点。
v0.2 基础功能与单元测试
实现字符数 -c、单词数 -w、句子数 -s,统计逻辑独立为 counter.py,并附带单元测试。
v0.2 文件结构:
wc_word-count/ [项目根目录]
├── README.md [文件] 项目说明
├── .gitignore [文件] Git 忽略规则
├── wc.py [文件] 程序入口(命令行层)
├── counter.py [文件] 字符/单词/句子统计(纯函数层)
├── samples/ [目录] 示例文本目录
│ └── sample.txt [文件] 基础功能示例
└── tests/ [目录] 单元测试目录
├── __init__.py [文件] 使 tests 成为包
└── test_counter.py [文件] 基础功能单元测试
v0.3 扩展功能与扩充测试
新增代码行统计 -l,输出代码行、空行、注释行。注释规则只识别 Python 的 #,不识别 //、/* */,避免 C 预处理指令等行产生歧义。统计逻辑独立为 line_counter.py,并扩充单元测试。
v0.3 文件结构:
wc_word-count/ [项目根目录]
├── README.md [文件] 项目说明
├── AI_PROMPTS.md [文件] AI 使用提示词记录
├── .gitignore [文件] Git 忽略规则
├── wc.py [文件] 程序入口(命令行层)
├── counter.py [文件] 字符/单词/句子统计(纯函数层)
├── line_counter.py [文件] 代码行统计(纯函数层,仅 Python 注释)
├── tools/ [目录] 辅助脚本目录
│ └── gen_large_txt.py [文件] 生成大文本用于性能测试
├── samples/ [目录] 示例文本目录
│ ├── sample.txt [文件] 基础功能示例
│ └── code_sample.py [文件] 代码行统计示例
├── docs/ [目录] 截图与文档资源目录
│ ├── v0.2_run.png [文件] v0.2 基础功能运行截图
│ ├── v0.3_run.png [文件] v0.3 扩展功能运行截图
│ ├── perf_words_snakeviz.png [文件] 单词统计性能分析图
│ ├── perf_chars_snakeviz.png [文件] 字符统计性能分析图
│ ├── ai_usage.png [文件] AI 使用过程截图
│ └── thinking.png [文件] 底部彩蛋展示图
└── tests/ [目录] 单元测试目录
├── __init__.py [文件] 使 tests 成为包
├── test_counter.py [文件] 基础功能单元测试
└── test_line_counter.py [文件] 代码行统计单元测试
运行环境
- Windows
- Python 3.8 及以上
- 无第三方依赖(仅使用标准库 argparse、re、unittest)
用法
命令格式:
python wc.py [参数] [文件名]
参数说明:
| 参数 | 含义 |
|---|---|
-c / --chars |
统计字符数 |
-w / --words |
统计单词数 |
-s / --sentences |
统计句子数 |
-l / --lines |
统计代码行、空行、注释行(按 Python 注释规则) |
-c、-w、-s、-l 四者互斥,一次运行只输出一类指标。
示例:
python wc.py -c samples/sample.txt
python wc.py -w samples/sample.txt
python wc.py -s samples/sample.txt
python wc.py -l samples/code_sample.py
可选:使用 PyInstaller 打包为 exe 后,命令形态与作业示例一致:
pyinstaller -F -n wc wc.py
wc.exe -c samples/sample.txt
统计规则
字符数 -c
统计文件全部字符,包括空格、标点和换行。
Windows 下 \r\n 按 Python 文本模式统一为 \n 计数,即一个换行算 1 个字符。
单词数 -w
由字母或数字组成的连续串算一个单词。
允许单词内部包含一个 ' 或 - 连接,例如 don't、well-known 各算一个单词。
小数点不作为连接符,3.14 会被拆成 3 和 14 两个单词。
句子数 -s
以 .、!、? 结尾的片段算一句。
连续终止符(如 ...、?!)只算一次句末标记。
小数点(前后均为数字的 .)不算句末,例如 3.14 不结束句子。
文件末尾没有终止符的片段不计为句子。
代码行 -l
本工程用 Python 实现,示例与统计对象均为 Python 源码,因此注释规则只识别 Python 的 # 单行注释,不识别 //、/* */ 等其它语言注释。
逐行分类,每行归入且仅归入以下三类之一:
- 空行:去掉首尾空白后为空的行。
- 注释行:该行除
#注释外没有有效代码。 - 代码行:既不是空行也不是注释行的行。
补充规则:
- 字符串内部的
#不视为注释,扫描时遇到"或'会跳过整个字符串内容,并处理转义\"、\'。 - 一行内有效代码后跟注释(如
x = 1 # note)计为代码行。 - 输出格式为三行:代码行、空行、注释行。
文件列表
| 文件/目录 | 说明 |
|---|---|
wc.py |
程序入口,负责命令行参数解析、读取文件、调用统计函数、输出结果 |
counter.py |
字符/单词/句子统计模块,纯函数,不涉及命令行 |
line_counter.py |
代码行/空行/注释行统计模块,纯函数,仅识别 Python # 注释 |
tools/gen_large_txt.py |
生成指定大小英文文本,供性能测试使用 |
tests/ |
单元测试目录,包含基础功能与扩展功能的测试用例 |
samples/ |
示例文本目录,存放用于手动验证的纯文本与 Python 源码 |
docs/ |
资源目录,存放运行结果、性能分析和 AI 使用的证明截图 |
README.md |
项目说明 |
AI_PROMPTS.md |
AI 使用提示词记录 |
.gitignore |
Git 忽略规则 |
例程运行结果
v0.2 基础功能运行结果
命令与输出:
> python wc.py -c samples/sample.txt
字符数: 103
> python wc.py -w samples/sample.txt
单词数: 20
> python wc.py -s samples/sample.txt
句子数: 5
运行截图:

v0.3 扩展功能运行结果
命令与输出:
> python wc.py -l samples/code_sample.py
代码行: 4
空行: 1
注释行: 1
运行截图:

单元测试
在项目根目录执行:
python -m unittest discover tests -v
或在 PyCharm 中右键 tests/test_counter.py、tests/test_line_counter.py 分别运行。
测试覆盖:
- 基础功能:空文本、纯字母、含空白、标点、撇号、连字符、数字、小数点、连续终止符、无终止符。
- 扩展功能:空文件、纯空行、纯代码、纯注释、代码后跟注释、字符串内
#、转义引号、#前无空格、混合文件。
性能测试
使用 Python 标准库 cProfile 采集耗时数据,并用 snakeviz 可视化。输入为 10MB 英文文本(使用 tools/gen_large_txt.py 生成)。
测试方法
python -m cProfile -o perf_words.prof wc.py -w samples/large_sample.txt
snakeviz perf_words.prof
python -m cProfile -o perf_chars.prof wc.py -c samples/large_sample.txt
snakeviz perf_chars.prof
测试结果
单词统计(-w,10MB)冰柱图:

字符统计(-c,10MB)冰柱图:

数据分析与结论
- 单词统计(
-w):总耗时约 0.336 秒。其中count_words耗时 0.316 秒,占比 94%。在count_words内部,正则findall耗时 0.294 秒,占该函数的 93%。结论:单词统计的时间瓶颈完全在于正则匹配,这是由统计规则(需处理'和-等连字符)决定的。 - 字符统计(
-c):总耗时约 0.0167 秒。主要耗时在argparse模块的解析初始化和文件读取(I/O)上。count_chars本身直接调用len(),耗时几乎趋近于 0(冰柱图中未呈现独立色块)。结论:字符统计在 O(1) 级别完成,性能极佳。 - 总结:对于 10MB 级别的文本,所有指标均能在百毫秒级甚至十毫秒级内完成,完全满足命令行工具的性能要求,无需优化。
提交记录
- v0.1 空项目
- v0.2 基础功能与单元测试
- v0.3 扩展功能与扩充测试
AI 使用声明
本项目在开发过程中使用了 AI 助手辅助,包括代码框架生成、逻辑复核、文档撰写和测试用例设计。所有 AI 生成内容均经过人工核对,并通过运行程序与单元测试验证。关键提示词记录见 AI_PROMPTS.md。
AI 使用过程截图:

一只大肥鱼
以上为工程的README.md文件,完整的 AI 提示词记录请见码云仓库 https://gitee.com/komeijimu/wc_word-count/blob/master/AI_PROMPTS.md
浙公网安备 33010602011771号