Fork me on GitHub

2020软件工程个人编程作业一:统计分析GitHub 的用户行为数据

2020软件工程个人编程作业一:统计分析GitHub 的用户行为数据

这个作业属于哪个课程 软件工程 https://edu.cnblogs.com/campus/fzu/SE2020
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
这个作业的目标 初步使用Python编写程序,熟悉GitHub的使用方法
学号 031802419

一、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
Estimate 估计这个任务需要多少时间 250 200
Development 开发
Analysis 需求分析 (包括学习新技术) 150 120
Design Spec 生成设计文档 5 5
Design Review 设计复审 2 2
Coding Standard 代码规范 (为目前的开发制定合适的规范) 0 0
Design 具体设计 20 30
Coding 具体编码 300 250
Code Review 代码复审 20 30
Test 测试(自我测试,修改代码,提交修改) 50 60
Reporting 报告
Test Report 测试报告
Size Measurement 计算工作量
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划
合计

二、解题过程

1.见题

初见题目,便满头问号,不是吧阿sir?怎么这么难。这json是个啥,os和argparse又是个啥,不行不行,我这菜鸡还是得等大佬先交然后参考参考。
但是直到现在,才有大佬提交代码。而且我发现我错了,为什么大佬的代码也看不懂啊。没办法,deadline要来了,自己整呗!

2.学习相关知识

首先,该庆幸的是,曾经学习过一段时间的Python,基本语法还是清楚的,再加上参考代码恰巧也是Python写的,因此我只需要先复习复习Python,便可参照代码动手操作了。
首先学习的知识是Python如何读取json文件,参考资料如下两个:

3.初始工作

首先便是将裕哥GitHub上的文件fork到自己的GitHub上,且同时需要随便改动一下readme.md文件,然后Pull Request。

4.初始思路

人又菜,又要交作业,好的方法想不出来,怎么办?
暴力解决一切问题
很简单,既然要统计分析用户的行为数据,那就直接遍历所有数据,将需要的找出来嘛!虽然或许大概可能会出现爆内存,超时等一系列问题,但是至少得把初始程序给完成,后续再修改嘛。(写都写不出,还要啥自行车?)
实验流程图如下:

5.代码实现

#读取json文件的实现过程
#这里考虑到可能又多个json文件,因此用一个列表记录所有的json文件
#之后再一个一个读取转换json文件
#参考完大佬们的代码后,实现代码如下:
def pretreatment(self,Address: str) -> bool:
        self.__User = {}
        self.__Repo = {}
        self.__UserAndRepo ={}
        findFile=False
        for root, dic, files in os.walk(Address): 
            for file in files:
                if file[-5:] == '.json':
                    findFile=True
                    json_path = file
                    filedir = open(Address+'\\'+json_path,
                             'r', encoding='utf-8')
                    while True:
                        line = filedir.readline()
                        if line :
                            if line.strip() == '':
                                continue
                            jsondata=json.loads(line)
                            if not jsondata["type"] in ['PushEvent', 'IssueCommentEvent', 'IssuesEvent', 'PullRequestEvent']:
                                continue
                            self.addEvent(jsondata)
                        else:
                            break
                    filedir.close()
        self.saveToFile()  
        return  findFile
#命令行初始化
def initArgparse(self):
    self.parser = argparse.ArgumentParser()
    self.parser.add_argument('-i', '--init')
    self.parser.add_argument('-u', '--user')
    self.parser.add_argument('-r', '--repo')
    self.parser.add_argument('-e', '--event')

#数据处理
if not jsondata["actor"]["login"] in self.__User.keys():
            self.__User[jsondata["actor"]["login"]] = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                      'PullRequestEvent': 0}
        if not jsondata["repo"]["name"] in self.__Repo.keys():
            self.__Repo[jsondata["repo"]["name"]] = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                      'PullRequestEvent': 0}
        if not jsondata["actor"]["login"] in self.__UserAndRepo.keys():
            self.__UserAndRepo[jsondata["actor"]["login"]] = {}
            self.__UserAndRepo[jsondata["actor"]["login"]][jsondata["repo"]["name"]] ={'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                      'PullRequestEvent': 0}
        elif not jsondata["repo"]["name"] in self.__UserAndRepo[jsondata["actor"]["login"]].keys():
            self.__UserAndRepo[jsondata["actor"]["login"]][jsondata["repo"]["name"]] = {'PushEvent': 0, 'IssueCommentEvent': 0, 'IssuesEvent': 0,
                      'PullRequestEvent': 0}
        self.__User[jsondata["actor"]["login"]][jsondata['type']] += 1
        self.__Repo[jsondata["repo"]["name"]][jsondata['type']] += 1
        self.__UserAndRepo[jsondata["actor"]["login"]][jsondata["repo"]["name"]][jsondata['type']] += 1
#结果输出
 def dataResult(self):
        if self.parser.parse_args().init:
            self.data = DataProcessing( True,self.parser.parse_args().init)
            return 0
        else:
            self.data = DataProcessing(False)
            if self.parser.parse_args().event:
                if self.parser.parse_args().user:
                    if self.parser.parse_args().repo:
                        result = self.data.getEventsByUsersAndRepos(
                            self.parser.parse_args().user, self.parser.parse_args().repo,
                            self.parser.parse_args().event)
                    else:
                        result = self.data.getEventsByUsers(
                            self.parser.parse_args().user, self.parser.parse_args().event)
                elif self.parser.parse_args().repo:
                    result = self.data.getEventsByRepos(
                        self.parser.parse_args().repo, self.parser.parse_args().event)
                else:
                    raise RuntimeError('error: argument -u or -r is required')
            else:
                raise RuntimeError('error: argument -e is required')
        return result

6.单元测试


7.性能测试


8.代码规范链接

https://github.com/Fiyvv/2020-personal-python/blob/master/codestyle.md

9.总结

对咱这种啥都不懂的人,遇上这种题目,几乎是做不出来的。但是经过几天的在csdn和博客园中兜兜转转,还是学到了些许知识,
首先是学会了GitHub的基本用法,然后还见识到了Python各种各样强大的库,且进一步熟悉了Python的语法知识。最最重要的是,我通过看各位大佬的博客,了解到了大佬的思考方式,遇到题目该如何着手去解决。
希望今后能够更多的运用自己掌握的知识去编写一个完完全全属于自己的程序!

posted @ 2020-09-16 00:14  FIYvv  阅读(365)  评论(2编辑  收藏  举报