震惊!!!源程序特征统计程序——基于python getopt库
项目github地址:https://github.com/holidaysss/WC
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
90 | 90 |
· Estimate |
· 估计这个任务需要多少时间 |
90 | 90 |
Development |
开发 |
365 | 385 |
· Analysis |
· 需求分析 (包括学习新技术) |
240 | 240 |
· Design Spec |
· 生成设计文档 |
20 | 20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
30 | 30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
15 | 15 |
· Design |
· 具体设计 |
180 | 180 |
· Coding |
· 具体编码 |
180 | 200 |
· Code Review |
· 代码复审 |
120 | 120 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
180 | 180 |
Reporting |
报告 |
165 | 165 |
· Test Report |
· 测试报告 |
120 | 120 |
· Size Measurement |
· 计算工作量 |
15 | 15 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 | 30 |
合计 |
620 | 640 |
执行代码:
if __name__ == '__main__':
opts, args = getopt.getopt(sys.argv[1:], "hc:w:l:s:a:")
files_list = [] # 相应后缀文件列表
main(opts)
主要函数:
count_word : 统计文件的词数(单词) (基本功能 -w)
def count_word(file):
list = open(file, 'r', encoding='utf-8').read()
word_list = []
end = 0
for i in range(len(list)): # 遍历全文
if list[i].isalpha() and i >= end: # 词首(字母)
for j in range(i, len(list)):
if (list[j].isalpha() == 0) or (j == len(list)-1): # 词尾(非字母)
word_list.append(list[i: j]) # 词
end = j
break
word_list.pop(-1)
for k, v in Counter(word_list).items():
print('{}: {}'.format(k, v))
num = len(word_list)
print('总词数: {}'.format(num))
count_char, count_line :统计字符数和行数 (基本功能 -c, -l)
def count_char(file):
num = len(open(file, 'r', encoding='ISO-8859-1').read())
print("文件{}的字符数(包括换行符)为{}".format(file, num)) def count_line(file):
print('文件{}的行数:'.format(file) +
str(len(open(file, 'r', encoding='ISO-8859-1').readlines())))
down_find: 递归查询当前目录下相应后缀(hz)的文件, 返回文件列表files (拓展功能 -s)
recursion: 对文件列表进行第二选项串判断,执行相应处理
def down_find(dir, hz):
dir_files = os.listdir(dir) # 路径下的文件列表
for i in dir_files: # 生成子目录
son_path = os.path.join(dir, i)
if os.path.isdir(son_path): # 如果是目录,递归操作
down_find(son_path, hz)
elif hz in son_path:
files_list.append(son_path)
return files_list def recursion(value):
op2 = value[0: 2] # 第二选项串
hz = args[0] # 文件后缀参数
dir = os.getcwd() # 当前路径
files = down_find(dir, hz) # 返回相应后缀文件列表
print("当前目录下符合后缀{}的文件有: {}".format(hz, files))
for file in files:
if op2 == "-c": # 返回字符数
count_char(file)
elif op2 == "-w": # 返回词的数目
count_word(file)
elif op2 == "-l": # 返回行数
count_line(file)
elif op2 == '-a':
more_data(file)
more_data: 返回文件空行,代码行,注释行数 (拓展功能 -a)
def more_data(value):
code_line = blank_line = comment_line = 0
end = -1
lines = open(value, 'r', encoding='ISO-8859-1').readlines()
for i in range(len(lines)):
if '#' in lines[i] and (i > end): # 单行注释
comment_line += 1
elif len(lines[i].strip()) <= 1: # 空行
blank_line += 1
elif lines[i][0].isalpha() and (i > end) and ('#' not in lines[i]): # 代码行
code_line += 1
elif lines[i].startswith('"""') and (i > end): # 多行注释
for j in range(i + 1, len(lines)):
if lines[j].startswith('"""'):
comment_line += (j - i + 1)
end = j
elif lines[i].startswith("'''") and (i > end):
for j in range(i + 1, len(lines)):
if lines[j].startswith("'''"):
comment_line += (j - i + 1)
end = j
print('文件:{}\n代码行:{}\n空行:{}\n注释行:{}\n'.format(value,code_line, blank_line, comment_line))
main():
def main(opts):
for op, value in opts: # op为选项串,value为附加参数
try:
if op == "-c": # 返回字符数
count_char(value)
elif op == "-w": # 返回词的数目
count_word(value)
elif op == "-l": # 返回行数
count_line(value)
elif op == "-s": # 递归处理目录下符合条件的文件
recursion(value)
elif op == "-a": # 返回代码行,空行,注释行数
more_data(value)
elif op == "-h":
print('-c file 返回文件 file 的字符数\n'
'-w file 返回文件 file 的词的数目\n'
'-l file 返回文件 file 的行数\n'
'-a file 返回空行代码行注释行数\n'
'-s -*[后缀] 递归相应后缀文件再执行基本指令')
sys.exit()
except FileNotFoundError as e:
print("{}\n输入 -h 查看帮助".format(e))
运行结果:
过程中遇到的问题:
1.打开文件的编码问题:刚开始默认gpk无法识别。后来换utf-8还不行,最后百度到转为
'ISO-8859-1',问题解决。 项目小结:
python 是当下比较流行的一种编译语言,学好python可以让一些让其他编译语言头疼的事变得轻松!
震惊!!!源程序特征统计程序——基于python getopt库的更多相关文章
- 个人项目 源程序特征统计程序(C++)
零.GitHub地址 https://github.com/King-Authur/Word-count 一.项目的相关要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这 ...
- 个人项目——wc源程序特征统计
这一次要做的项目是wc——统计程序文件特征的命令行程序. 根据需求需求得到的模式为:wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需 ...
- 【Python Deap库】遗传算法/遗传编程 进化算法基于python DEAP库深度解析讲解
目录 前言 概述 启发式的理解(重点) 优化问题的定义 个体编码 初始族群的创建 评价 配种选择 锦标赛 轮盘赌选择 随机普遍抽样选择 变异 单点交叉 两点交叉 均匀交叉 部分匹配交叉 突变 高斯突变 ...
- 基于Python Pillow库生成随机验证码
from PIL import Image from PIL import ImageDraw from PIL import ImageFont import random class ValidC ...
- 二维码生成器,基于python,segno库
import segno temp = input("Please enter value:") qr = segno.make(temp) qr.save("qrcod ...
- 【python(deap库)实现】GEAP 遗传算法/遗传编程 genetic programming +
目录 前言 1.优化问题的定义 单目标优化 多目标优化 2.个体编码 实数编码 二进制编码 序列编码(Permutation encoding) 粒子(Particles) 3 初始种群建立 一般族群 ...
- 基于Python实现的系统SLA可用性统计
基于Python实现的系统SLA可用性统计 1. 介绍 SLA是Service Level Agreement的英文缩写,也叫服务质量协议.根据SRE Google运维解密一书中的定义: SLA是服务 ...
- 基于Python的Web应用开发实战——2 程序的基本结构
2.1 初始化 所有Flaks程序都必须创建一个程序实例. Web服务器使用一种名为Web服务器网关接口(Web Server Gateway Interface,WSGI)的协议,把接收自客户端的所 ...
- selenium2自动化测试实战--基于Python语言
自动化测试基础 一. 软件测试分类 1.1 根据项目流程阶段划分软件测试 1.1.1 单元测试 单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程. 1.1.2 集成测试 ...
随机推荐
- dubbo基础学习总结
Dubbo基本原理机制 分布式服务框架: –高性能和透明化的RPC远程服务调用方案 –SOA服务治理方案 -Apache MINA 框架基于Reactor模型通信框架,基于tcp长连接 Dubbo缺省 ...
- mysql 自定义插件调试
# 创建表的stack frame #0: 0x000000011d11f58a ha_spartan.so`Spartan_data::create_table(this=0x00007f9fc13 ...
- JavaScript中的this详解
前言 this用法说难不难,有时候函数调用时,往往会搞不清楚this指向谁?那么,关于this的用法,你知道多少呢? 下面我来给大家整理一下关于this的详细分析,希望对大家有所帮助! this指向的 ...
- python中pyperclip库的功能
python3中pyperclip库的功能 作用就是复制.粘贴 例子 import pyperclip pyperclip.copy('Hello world!') pyperclip.paste() ...
- 转载:dos批处理中路径获取
在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容是不同的. 1. %cd% ...
- 数据结构复习之Vector
/** * The number of times this list has been <i>structurally modified</i>. * Structural ...
- cvte春招测试面试记录
cvte春招测试面试记录,挂在了综合面试(hr面)...尽量回忆面试的问题(可能不完全). 技术面一面: 1.自我介绍 2.根据实习项目问,智能客服怎么测正确率之类的. 3.测试人脸解锁 4.测试微信 ...
- 网页Title加LOGO图标
<link rel="icon" href="XXX.ico" type="image/x-icon"/> 只能放格式为.ico ...
- 记初学python的一些心得
人生苦短,我用python! 其实我自学python也很长一段时间了,但总是去更换学习资料,搞的现在学的不是很好,因为没更换次资料都要从头开始学起,那么分享下我的学习战况吧,不是很好,还将就的能看. ...
- JS一些简单的问题
冒泡排序1 <script> //冒泡排序:把一组数据按照从大到小,或者从小到大的进行一定的排序 //从小到大排序 var num=[10,2,58,3,56,4,12]; //比较轮数 ...