震惊!!!源程序特征统计程序——基于python getopt库

时间:2021-10-30 15:33:31

项目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))

运行结果

震惊!!!源程序特征统计程序——基于python getopt库

震惊!!!源程序特征统计程序——基于python getopt库


过程中遇到的问题

  1.打开文件的编码问题:刚开始默认gpk无法识别。后来换utf-8还不行,最后百度到转为

'ISO-8859-1',问题解决。

项目小结
python 是当下比较流行的一种编译语言,学好python可以让一些让其他编译语言头疼的事变得轻松!