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.单元测试和性能优化有没有做,明天再搞懂一点一定会补上!

posted @ 2020-09-16 22:44  白_white  阅读(26)  评论(4编辑  收藏