2020fzu软件工程第一次个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2020
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167
这个作业的目标 学习分析 Json 文件数据,以及熟悉 GitHub 的使用
学号 031802403

一、psp表格

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

二、解题心路历程以及解题思路

1.刚拿到题时

  这是啥意思?什么叫关注以下几种信息类型?

  貌似是一个链接,怎么点不开?

  统计什么东西?这是什么意思?

  用Git进行版本控制是什么鬼?

2.思考用什么语言

  要不用c++吧,毕竟熟悉。

  不过后面也要学java,要不直接顺带学java了

  学了两天java后,舍友都开始学python

  老师给的例子不就是python的吗?

  而且之前学过python的基本语法
  
  跳槽跳槽

3.拿到json文件并打开后

  瞬间知道了题目的意思

  而且思路逐渐清晰起来

  不就是把json文件读取后分析嘛

  大不了弄成列表直接用list.count()得了

  等等,五万多个数据?打扰了

  华裕哥给的文件好像还不能直接运行,会出错

  好在勉强看的懂

4.开始在csdn上求救

  各种搜索

  开始仔细分析题目需求

  发现前面两个需求确实既好理解又比较简单

  开始在csdn上搜索关于json文件数据分析的文章

5.开始尝试着理解华裕哥的代码

  理解着顺便尝试着写一下读取json文件的类

  学习了json.dumps和json.load两个函数的用法

  思路分析的差不多了,接下来就是跟着华裕哥的代码来写出自己的答案了

三、初始想法

  一开始直接就是想着五万多个数据也不多,直接用json.dump直接解码然后进行分析

  这大概就是同学们所说的单线程模式

  不用想,这个虽然大概率也可以实现,但是效率绝对不高

  看了华裕哥给出的示例代码以及在网上询问同学

  我决定也试着写多线程的方式

  把json文件分为三部分

  按顺序将json文件里的内容分给三个线程

总体思路

四、代码说明

命令参数注册

def initArgparse(self):
     # 初始化Arg
     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')

1.读取函数


 def __init__(self, dict_address: int = None, reload: int = 0):
        if reload == 1:
            self.__init(dict_address)
        if dict_address is None and not os.path.exists('1.json') and not os.path.exists('2.json') and not os.path.exists('3.json'):
            raise RuntimeError('error: init failed')
        x = open('1.json', 'r', encoding='utf-8').read()
        self.__4Events4PerP = json.loads(x)
        x = open('2.json', 'r', encoding='utf-8').read()
        self.__4Events4PerR = json.loads(x)
        x = open('3.json', 'r', encoding='utf-8').read()
        self.__4Events4PerPPerR = json.loads(x)

2.json的写入读取与解析


def __init(self, dict_address: str):
        json_list = []
        for root, dic, files in os.walk(dict_address):
            for f in files:
                if f[-5:] == '.json':
                    json_path = f
                    x = open(dict_address+'\\'+json_path,
                             'r', encoding='utf-8').read()
                    str_list = [_x for _x in x.split('\n') if len(_x) > 0]
                    for i, _str in enumerate(str_list):
                        try:
                            json_list.append(json.loads(_str))
                        except:
                            pass
        records = self.__listOfNestedDict2ListOfDict(json_list)
        self.__4Events4PerP = {}
        self.__4Events4PerR = {}
        self.__4Events4PerPPerR = {}
        for i in records:
            if not self.__4Events4PerP.get(i['actor__login'], 0):
                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
            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)

3.运行类


class Run:
    def __init__(self):
        self.parser = argparse.ArgumentParser()
        self.data = None
        self.argInit()
        print(self.analyse())

    def argInit(self):
        self.parser.add_argument('-i', '--init')
        self.parser.add_argument('-u', '--user')
        self.parser.add_argument('-r', '--repo')
        self.parser.add_argument('-e', '--event')

    def analyse(self):
        if self.parser.parse_args().init:
            self.data = Data(self.parser.parse_args().init, 1)
            return 0
        else:
            if self.data is None:
                self.data = Data()
            if self.parser.parse_args().event:
                if self.parser.parse_args().user:
                    if self.parser.parse_args().repo:
                        count = self.data.getEventsUsersAndRepos(
                            self.parser.parse_args().user, self.parser.parse_args().repo, self.parser.parse_args().event)
                    else:
                        count = self.data.getEventsUsers(
                            self.parser.parse_args().user, self.parser.parse_args().event)
                elif self.parser.parse_args().repo:
                    count = 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 count

4.运行结果

5.性能分析

五、代码规范

https://github.com/netee-jet/-/blob/master/README.md

六、fork到仓库

七、总结

  这次作业让我知道了自己和大佬的差距有多大,
  用了一个多小时复习了大一学过的python基础语法,
  原来的我读了两年是真的什么东西也不会啊,
  不过通过两天几乎没休息的在csdn中探索,
  我也是勉强的知道了json文件类的一些操作。
  在接下来的这一学期里还是得花更多的心思在专业课的学习上面。
posted @ 2020-09-15 17:21  ultra-Jet  阅读(211)  评论(1编辑  收藏  举报
动态线条
动态线条end
Live2D