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. Java可重入锁与不可重入锁

    可重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的. synchronized 和   ReentrantLock 都是可重入锁. 可重入 ...

  2. 常用快捷键及eclipise快捷键

    win+R 运行...win+D 桌面win+E 打开我的电脑win+F 搜索 ctrl+D删除光标所在行

  3. Marriage Match II(二分+并查集+最大流,好题)

    Marriage Match II http://acm.hdu.edu.cn/showproblem.php?pid=3081 Time Limit: 2000/1000 MS (Java/Othe ...

  4. iOS - 组件化探究之私有库的创建

    http://www.cocoachina.com/ios/20180511/23359.html

  5. 【JVM】浅谈双亲委派和破坏双亲委派

    一.前言 笔者曾经阅读过周志明的<深入理解Java虚拟机>这本书,阅读完后自以为对jvm有了一定的了解,然而当真正碰到问题的时候,才发现自己读的有多粗糙,也体会到只有实践才能加深理解,正应 ...

  6. 构建openssl debug版

    一.简介 作为一种安全协议,openssl囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用. 参考: http://www.linuxidc ...

  7. ZOJ 3946.Highway Project(The 13th Zhejiang Provincial Collegiate Programming Contest.K) SPFA

    ZOJ Problem Set - 3946 Highway Project Time Limit: 2 Seconds      Memory Limit: 65536 KB Edward, the ...

  8. Codeforces 608B. Hamming Distance Sum 模拟

    B. Hamming Distance Sum time limit per test: 2 seconds memory limit per test:256 megabytes input: st ...

  9. Autotest Weekly Report

    Autotest Weekly Report Reported by: 12/16/2013 What I Did Last Week Debug autotest scripts of ‘smart ...

  10. 2014.1.4 cxf spring webservice

    先创建 webservice 服务端 . 首先下载 cxf jar 包 , cxf-2.7.8 . 新建 web 项目 aa . 将下载的cxf 压缩文件解压,将lib 下的jar 全部build p ...