AIGC标识 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 的 # 单行注释,不识别 //、/* */ 等其它语言注释。

逐行分类,每行归入且仅归入以下三类之一:

  1. 空行:去掉首尾空白后为空的行。
  2. 注释行:该行除 # 注释外没有有效代码。
  3. 代码行:既不是空行也不是注释行的行。

补充规则:

  • 字符串内部的 # 不视为注释,扫描时遇到 " 或 ' 会跳过整个字符串内容,并处理转义 \"、\'。
  • 一行内有效代码后跟注释(如 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.2 运行截图

v0.3 扩展功能运行结果

命令与输出:

> python wc.py -l samples/code_sample.py
代码行: 4
空行: 1
注释行: 1

运行截图:

v0.3 运行截图

单元测试

在项目根目录执行:

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 使用过程截图:

AI 使用截图

一只大肥鱼

thinking

以上为工程的README.md文件,完整的 AI 提示词记录请见码云仓库 https://gitee.com/komeijimu/wc_word-count/blob/master/AI_PROMPTS.md

posted @ 2026-10-29 22:56  廖原  阅读(18)  评论(0)    收藏  举报