GitHub仓库:https://github.com/15crmor/PAC

项目要求

  • 基本要求

    • -c 统计文件字符数 (实现)

    • -w 统计文件词数 (实现)

    • -l 统计文件行数(实现)

  • 扩展功能

    • -s 递归处理目录下符合条件得文件(实现)
    • -a 返回文件代码行 / 空行 / 注释行(实现)
  • 高级功能

    • -x 图形化界面(未实现)

解题思路

  •  实现对文本的统计
    • 读取文件
    • 使用正则表达式处理文本内容
  • 再实现拓展功能更复杂的统计及批量操作
    • 用os模块获取文件以及判断是文件或目录
    • 遍历目录下所有符合的文件
  • 最后实现命令参数解析
    • 用sys模块实现在命令行解析参数

设计

  • 将各个功能放在不同文件中

    •  主文件及相应模块

      •  WC.py:

        • recursive(list) (遍历文件)
        • wc(f, arg) (实现命令参数解析)
    •  统计字符文件及模块
      •  strCount.py:

        • str_count(name)
    •  统计行数文件及模块:
      •  lineCount.py:

        • line_count(name)
    • 统计单词文件及模块:
      •  wordsCount.py:

        • words_count(name)
    • 统计代码行/空行/注释行文件及模块:
      • codeCount.py:

        • code_count(name)

流程图

代码说明

1. 遍历文件

def recursive(list):
f_list = os.listdir(list)
return f_list

2. 统计字符数

def str_count(name):
with open(name, 'r', encoding='UTF-8') as f:
n = 0
for line in f.readlines():
n += len(line)
return n

3. 统计行数

def line_count(name):
with open(name, 'r', encoding='UTF-8') as f:
n = 0
for line in f:
n += 1
return n

4. 统计单词数

import re

def words_count(name):
with open(name, 'r', encoding='UTF-8') as f:
n = 0
for line in f.readlines():
list_match = re.findall('[a-zA-Z]+', line.lower())
n += len(list_match)
return n

5. 统计空行/代码行/注释行数

def code_count(name):
with open(name, 'r', encoding='UTF-8') as f:
code_lines = 0
comm_lines = 0
space_lines = 0
for line in f.readlines():
if line.strip().startswith('#'):
comm_lines += 1
elif line.strip().startswith("'''") or line.strip().startswith('"""'):
comm_lines += 1
elif line.count('"""') == 1 or line.count("'''") == 1:
while True:
line = f.readline()
comm_lines += 1
if ("'''" in line) or ('"""' in line):
break
elif line.strip():
code_lines += 1
else:
space_lines += 1 return code_lines, comm_lines, space_lines

6. 命令行逻辑

def wc(f, arg):
if arg[1] == '-c':
str_num = str_count(f)
print(f + "文件字符数为: ", str_num)
elif arg[1] == '-w':
word_num = words_count(f)
print(f + "文件单词数为:", word_num)
elif arg[1] == '-l':
line_num = line_count(f)
print(f + "文件行数为:", line_num)
elif arg[1] == '-a':
code_lines_num, comm_lines_num, space_lines_num = code_count(f)
print(f + "文件代码行为:", code_lines_num)
print("注释行为:", comm_lines_num)
print("空行为:", space_lines_num)

测试运行

由于事先设置了工作路径所以默认路径与代码所在路径不同

  • 基本模块测试

  • 扩展模块测试

  • 递归遍历文件夹下文件测试

  • 文件名出错时

代码覆盖率

PSP

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

60

60

· Estimate

· 估计这个任务需要多少时间

60

60

Development

开发

300

360

· Analysis

· 需求分析 (包括学习新技术)

60

100

· Design Spec

· 生成设计文档

30

30

· Design Review

· 设计复审 (和同事审核设计文档)

20

30

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

30

20

· Design

· 具体设计

30

30

· Coding

· 具体编码

240

300

· Code Review

· 代码复审

30

40

· Test

· 测试(自我测试,修改代码,提交修改)

60

60

Reporting

报告

20

30

· Test Report

· 测试报告

60

60

· Size Measurement

· 计算工作量

20

20

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

20

30

合计

1040

 1220

项目总结

  以前写代码从没考虑过这么多,总是思考一阵之后便直接上手,遇到什么问题就查书查网上资料解决,突然想改就把之前写的模块推翻重来,因此也做了不少无用功,而且也很少总结,现在这样虽然工作量多了但是却感觉比以前开发要更快,少走了不少弯路,而且有写了博客后也感觉比之前掌握的更加扎实。

Python 实现WC功能的更多相关文章

  1. 软件工程—WC功能实现 (JAVA)

    软件工程-WC功能实现(JAVA) Github项目地址:https://github.com/Ousyoung/wc 项目要求 ​ wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和 ...

  2. Python实现截图功能你肯定不会吧?【面试必学】

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:CyborgLin python实现截图功能. windows环境下.需 ...

  3. 【python库模块】Python subprocess模块功能与常见用法实例详解

    前言 这篇文章主要介绍了Python subprocess模块功能与常见用法,结合实例形式详细分析了subprocess模块功能.常用函数相关使用技巧. 参考 1. Python subprocess ...

  4. Python实现截图功能

    Python实现截图功能 Windows环境下需要用到PIL库,使用pip安装PIL库: pip install Pillow 安装完成,截图方法代码: from PIL import ImageGr ...

  5. 使用 python 实现 wc 命令程序的基本功能

    这里使用了 python 的基本代码实现了 Linux 系统下 wc 命令程序的基本功能. #!/usr/bin/env python #encoding: utf-8 # Author: liwei ...

  6. 通过python实现wc基本功能

    ---恢复内容开始--- 1.Github项目地址: https://github.com/zhg1998/ww/blob/master/wc.py 2.项目相关要求: 写一个命令行程序,模仿已有wc ...

  7. Python模拟wc命令(软件测试第二次作业)

    Python实现字符,单词,行,代码行,空行及可视化 Gitee项目地址:https://gitee.com/biubiubiuLYQ/word_and_character_statistics 一. ...

  8. python实现curl功能

    之前写过一篇文章关于python CURL模块的,在这里我们从urllib来实现同样的功能.具体代码如下: import urllib import urllib2 import json #发起请求 ...

  9. 利用PYTHON设计计算器功能

    通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3 ...

随机推荐

  1. scala spark 调用hivecontext

    import org.apache.spark.rdd.RDD def save(data: RDD[ModelReplay], modelKey: String, dt: String): Unit ...

  2. Eclipse中Git插件使用技巧:还原文件

    如果修改了某个文件并未提交至本地库(add index),那么怎么还原呢?Git插件中并不像Svn插件直接提供有还原方式.其实无论是否提交至本地库或者远程库,还原操作的本质都是将文件的当前版本还原至之 ...

  3. 结对编程--fault,error,failure

    结对编程对象:叶小娟 对方博客地址:http://www.cnblogs.com/yxj63/ 双方贡献比例:1:1 结对照片: 结对题目:输入一定个数的数字,对其排序后输出最大值.   1 pack ...

  4. 清明梦超能力者黄YY(idx数组)

    清明梦超能力者黄YY https://www.nowcoder.com/acm/contest/206/I 题目描述 黄YY是一个清明梦超能力者,同时也是一个记忆大师.他能够轻松控制自己在梦中的一切, ...

  5. iOS8 之后 tableview separatorInset cell分割线左对齐,ios7的方法失效了

    -(void)viewDidLayoutSubviews { if ([self.mytableview respondsToSelector:@selector(setSeparatorInset: ...

  6. php Pthread 多线程 (三) Mutex 互斥量

    当我们用多线程操作同一个资源时,在同一时间内只能有一个线程能够对资源进行操作,这时就需要用到互斥量了.比如我们对同一个文件进行读写操作时. <?php class Add extends Thr ...

  7. C#中发送邮件,包含Html代码 CDO.Message

    C#代码: /// <summary> /// 发送邮件 /// </summary> /// <param name="context">&l ...

  8. .net core webapi 部署windows server 2008 r2 笔记

    WebAPI部署文档 安装dotnet-dev-win-x64.1.0.4 安装DotNetCore.1.1.0-WindowsHosting 安装vc_redist.x64 安装Windows6.1 ...

  9. li.active2有加强重要性的效果。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 移动文件读/写指针----lseek

    头文件:#include<sys/types.h>.#include<unistd.h> 函数原型:off_t lseek(int fildes,off_t offset,in ...