软件工程——Word-Counter
Python实现Word-Counter
一、前言
Github地址:https://github.com/hzquestion/Word-Counter
二、项目概述
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
处理模式:
python Word-Counter.py [parameter] [filename]
基本功能列表(实现):
Word-Counter.py -c file.c
//返回文件 file.c 的字符数Word-Counter.py -w file.c
//返回文件 file.c 的词的数目Word-Counter.py -l file.c
//返回文件 file.c 的行数
扩展功能(未实现):
-s
递归处理目录下符合条件的文件。-a
返回更复杂的数据(代码行 / 空行 / 注释行)。
高级功能(未实现):
-x
参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。
三、PSP
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 |
10 |
· Estimate |
· 估计这个任务需要多少时间 |
480 |
600 |
Development |
开发 |
420 |
540 |
· Analysis |
· 需求分析 (包括学习新技术) |
120 |
200 |
· Design Spec |
· 生成设计文档 |
20 |
20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
10 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
30 |
· Design |
· 具体设计 |
90 |
100 |
· Coding |
· 具体编码 |
110 |
130 |
· Code Review |
· 代码复审 |
20 |
20 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
20 |
30 |
Reporting |
报告 |
60 |
60 |
· Test Report |
· 测试报告 |
30 |
30 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 |
20 |
合计 |
490 |
610 |
四、解题思路描述
- 读取文件,并完成对文件的处理工作
- 对基础功能进行分析,先完成基础功能
- 测试运行,修复bug
- 优化代码,尝试完成扩展功能
五、设计实现过程
- 实现计算字符数的函数
- 实现计算单词数的函数
- 实现计算行数的函数
- 设计主函数输出结果
- 用不同的源代码文件进行测试
- 优化代码
六、代码说明
计算字符数
def Char_Count(filename):
#字符数统计
charcount = 0
try:
with open(filename, encoding = 'utf-8') as fi:
for x in fi:
match = re.findall(r'[\s]+', x)
for i in match:
x = x.replace(i, '')
charcount += len(x)
return charcount
except IOError:
print("Failed to open the file,please check if the path is correct.")
计算单词数
def Word_Count(filename, encoding = 'utf-8'):
#单词数统计
wordcount = 0
try:
with open(filename) as fi:
for x in fi:
match = re.findall(r'[a-zA-Z-\']+',x)
wordcount += len(match)
return wordcount
except IOError:
print("Failed to open the file,please check if the path is correct.")
计算行数
def Line_Count(filename, encoding = 'utf-8'):
#行数统计
linecount = 0
try:
with open(filename) as fi:
for x in fi:
linecount += 1
return linecount
except IOError:
print("Failed to open the file,please check if the path is correct.")
主函数输出
if __name__=='__main__':
#主函数
print('Word-Counter starts working...')
print('--------------------------------')
parser = argparse.ArgumentParser(description="This is a Word-Counter.")
parser.add_argument("-c", metavar = "--character", dest = "char_arg", help = "Return number of characters.")
parser.add_argument("-w", metavar = "--word", dest = "word_arg", help = "Return number of words.")
parser.add_argument("-l", metavar = "--line", dest = "line_arg", help = "Return number of lines.")
args = parser.parse_args()
if args.char_arg:
charcount = Char_Count(args.char_arg)
print("Number of characters:%s" % (charcount))
if args.word_arg:
wordcount = Word_Count(args.word_arg)
print("Number of words:%s" % (wordcount))
if args.line_arg:
linecount = Line_Count(args.line_arg)
print("Number of lines:%s" % (linecount))
七、测试运行
1.空文件
2.只有一个字符的文件(#)
3.只有一个词的文件(test)
4.只有一行的文件(i like it very much.)
5.一个典型的源文件
八、项目小结
此次是我第一次用python编写一个完整的小工程。由于暑假后半段时间有空闲,学了些许python,然后就拿这个作业来练练手了。
过程中遇到的问题有很多,所以学习新东西的时间出乎意料的长,说一些主要的问题:
一是对许多模块功能没有使用过,特别是argparse模块,花费了大量时间;
二是该项目涉及到的部分函数没有接触过,对其用法的学习也花费了不少时间;
三是其中对于读取文件的编码方式,一开始经常读取错误,后来把编码方式限定为‘utf-8’才解决问题;
四是对于.c文件中含有中文字符的代码文件的计算会出错,这个bug至今没有修复,由于开始项目的时间较晚,且最后在编辑博客贴运行结果截图的时候才偶然发现,已经没有足够的时间,留待日后有空再进行修复。
总的来说本次作业的完成不算是顺利,由于时间问题没有完全修复bug以及完成扩展功能,但也基本完成了基础功能。此次作业对我的提升还是挺大的,毕竟之前并未尝试独立完成一个软件工程,以后可以继续尝试。
软件工程——Word-Counter的更多相关文章
- 软件工程作业——Word Counter
github地址 https://github.com/Pryriat/Word_Counter 项目说明 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命 ...
- 第三周作业--Word Counter
需求分析: 1.写出一个程序,模仿wc.exe,通过输入文件名,实现文件内容读取: 2.统计出文件内容的总字符数.总单词数.行数.每行字符数.每行单词数. 代码分析: 一.打开文件. FILE *fp ...
- 软件工程firstblood
https://github.com/happyeven/WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有wc.exe 的 ...
- 小白Linux入门 四
http://edu.51cto.com/lesson/id-11372.html 28了 文件管理类命令 目录: mkdir mkdir /tmp/x mkdir -p /tmp/a/b -pv b ...
- 【大数据】Linux下Storm(0.9版本以上)的环境配置和小Demo
一.引言: 在storm发布到0.9.x以后,配置storm将会变得简单很多,也就是只需要配置zookeeper和storm即可,而不再需要配置zeromq和jzmq,由于网上面的storm配置绝大部 ...
- Flex的正则表达式匹配速度与手工代码的比较
flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷 ...
- Storm工程创建
1.创建maven项目: pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&quo ...
- Asp.net MVC Bundle 的使用与扩展
一.Asp.net 自带Bundle的使用: 1. 在Globale中注册与配置 BundleConfig.RegisterBundles(BundleTable.Bundles); public c ...
- Hadoop平台提供离线数据和Storm平台提供实时数据流
1.准备工作 2.一个Storm集群的基本组件 3.Topologies 4.Stream 5.数据模型(Data Model) 6.一个简单的Topology 7.流分组策略(Stream grou ...
- word2vec代码解释
以前看的国外的一篇文章,用代码解释word2vec训练过程,觉得写的不错,转过来了 原文链接 http://nbviewer.jupyter.org/github/dolaameng/tutorial ...
随机推荐
- The way to Go(6): Go程序的基本结构和要素
Reference: Github: Go Github: The way to Go Go程序的基本结构和要素 helloworld.go: package main import "fm ...
- 07_Flume_regex interceptor实践
实践一:regex filter interceptor 1.目标场景 regex filter interceptor的作用: 1)将event body的内容和配置中指定的正则表达式进行匹配2)如 ...
- jquery和bootstrap获取checkbox选中的多行数据
在项目中,经常遇到,于是整理 引用bootstrap的js和css 代码解释: $("#dgFlowList").find(":checkbox:checked" ...
- go 修改字符串
在Go中字符串是不可变的,例如下面的代码编译时会报错:cannot assign to s[] var s string = "hello" s[] = 'c' 但如果真的想要修改 ...
- c++ primer plus 第六章 课后题答案
#include <iostream> #include <cctype> using namespace std; int main() { char in_put; do ...
- css3转盘
此效果涉及到 : 1. css 画图形 2. css3 动态效果 3. 贝塞尔曲线 用法 <style> .lds-hourglass { display: inline-block; p ...
- Android JNI学习(四)——JNI的常用方法的中文API
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- svg操纵方案 基于 D3 还是 angular?
之前还是想简单了, 现在重新写这篇.把逻辑拆分粒度的辨析,放到外面去. 问题提出:svg控制方案 基于 D3 还是 angular 根据这个,html 4种展现样式:普通的html,svg,2D ca ...
- linux上python安装相关
[CentOS上安装python2.7和ipython]1,安装依赖库yum install readline-devel 2,按装python2.7和ipython //使用ipython需要先安装 ...
- PWA小记
前言 中国有不一样的MobileFirst战略,重原生应用,轻移动网页: 移动网页的弱势:页面设计优化有限,用户体验受网络环境影响,网页开启不方便: web优势是产品分发 app优势是产品使用和交互 ...