2020软件工程个人编程作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2020 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167 |
这个作业的目标 | <学习文件的读取分析,代码的优化测试> |
学号 | 171809006 |
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 200 |
Estimate | 估计这个任务需要多少时间 | 100 | 200 |
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 60 | 100 |
Design Spec | 生成设计文档 | 30 | 30 |
Design Review | 设计复审 | 30 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
Design | 具体设计 | 30 | 40 |
Coding | 具体编码 | 500 | 600 |
Code Review | 代码复审 | 300 | 600 |
Test | 测试(自我测试,修改代码,提交修改) | ||
Reporting | 报告 | 40 | 30 |
Test Report | 测试报告 | ||
Size Measurement | 计算工作量 | 60 | 80 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 |
解题思路
刚开始看到题目的时候完全不知道题目要做什么,再仔细看了好几遍题目,才大概知道是对数据进行分析统计,但是如何去实现还是毫无思绪,经过询问各位大佬,看了示例数据以及对参考程序的逐行理解后,知道了要对json文件进行解析,然后读取,分析得到结果。然后,我进行了任务分解:
-
命令行解析
对命令行之前没有过了解,就照着给出的参考程序一个个函数的去查,学习了argparse模块的基本用法,也通过给定格式要求和自己尝试学习怎么使用,但是还是有很多地方不是很明白。
-
解析读取json文件
我认为这次作业的重点就是在对json文件的解析,json文件之前也是没有了解过,也是通过各大网站进行查询,学习了怎么解析json文件,能够理解其实现,但是还是不大会用。
-
json文件的查询
-
统计得到结果
实现过程
首先是进行初始化,将json文件读入,提取所需关键字,然后将其写入新的json文件中,然后按字典在新文件中进行查询
代码说明
首先是对原json文件进行解析
for root, dic, files in os.walk(dict_address): # topdown默认为true,walk会遍历每个文件夹与文件夹中子目录
for f in files:
if f[-5:] == '.json': # 文件后缀为.json
json_path = f # 将.json路径记录下来
x = open(dict_address + '\\' + json_path,
'r', encoding='utf-8').read() # 打开.json文件 只读 readline返回一行 read读整个文件会爆? readline每次读一行
str_list = [_x for _x in x.split('\n') if len(_x) > 0]
for i, _str in enumerate(str_list): # enumerate函数将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列
try:
# 在列表末尾添加新的对象
json_list.append(json.loads(_str)) # json.load()将json格式的字符串转换成python的数据类型,返回的是str不是dict
except:
pass # 防止出错
把需要的关键字和值写入新的json文件中
for i in records:
if not self.__4Events4PerP.get(i['actor__login'], 0): # 判断字典中是否有键actor_login
self.__4Events4PerP.update({i['actor__login']: {}}) # 没有就加入
self.__4Events4PerPPerR.update({i['actor__login']: {}})
self.__4Events4PerP[i['actor__login']][i['type']
] = self.__4Events4PerP[i['actor__login']].get(i['type'], 0) + 1 # 获取到相应type的值+1,type没有为0
if not self.__4Events4PerR.get(i['repo__name'], 0):
self.__4Events4PerR.update({i['repo__name']: {}})
self.__4Events4PerR[i['repo__name']][i['type']
] = self.__4Events4PerR[i['repo__name']].get(i['type'], 0) + 1
if not self.__4Events4PerPPerR[i['actor__login']].get(i['repo__name'],
0):
self.__4Events4PerPPerR[i['actor__login']].update({i['repo__name']: {}})
self.__4Events4PerPPerR[i['actor__login']][i['repo__name']][i['type']
] = self.__4Events4PerPPerR[i['actor__login']][i['repo__name']].get(i['type'], 0) + 1
with open('1.json', 'w', encoding='utf-8') as f: # 文件不存在就生成
json.dump(self.__4Events4PerP, f) # 将内容序列化,并写入打开的文件中 存个人事件
with open('2.json', 'w', encoding='utf-8') as f:
json.dump(self.__4Events4PerR, f) # 项目事件
with open('3.json', 'w', encoding='utf-8') as f:
json.dump(self.__4Events4PerPPerR, f) # 每个人每个项目的事件
查询并统计需要的值
if self.parser.parse_args().event:
if self.parser.parse_args().user:
if self.parser.parse_args().repo:
res = self.data.getEventsUsersAndRepos(
self.parser.parse_args().user, self.parser.parse_args().repo,
self.parser.parse_args().event)
else:
res = self.data.getEventsUsers(
self.parser.parse_args().user, self.parser.parse_args().event)
elif self.parser.parse_args().repo:
res = self.data.getEventsRepos(
self.parser.parse_args().repo, self.parser.parse_args().event)
else:
raise RuntimeError('error: argument -l or -c are required')
else:
raise RuntimeError('error: argument -e is required')
return res
单元测试
截图和描述
覆盖率
优化及性能测试
代码规范
https://github.com/BGL245/2020-personal-python/blob/master/codestyle.md
总结
太难了!!!!!!
1.自己对这三种编程语言都没有很熟悉,之前都知识写一些小作业,一些知识都没有去学习,导致此次作业有一定的困难,觉得自己还有很多东西需要去学习,希望自己能在这学期精通一门编程语言
2.命令行,json文件完全没有了解过,通过查找资料才理解了一些,但还是没有学透,也不能很好的使用。
3.GitHub也是搞了很久都还弄得不是很明白,希望通过再进一步的学习能熟练掌握吧。
4.通过这次的编程作业,自己的差距还是很大,还是要向各位大佬看齐,多学一点东西,多实践。
5.单元测试和性能优化有没有做,明天再搞懂一点一定会补上!