软工实践第一次个人编程作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2020 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020 |
这个作业的目标 | 学习解析json文件,分析数据,进一步学习github |
学号 | |
使用语言 |
一. PSP 表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 60 |
Estimate | 估计这个任务需要多少时间 | 600 | 500 |
Development | 开发 | 120 | 200 |
Analysis | 需求分析 (包括学习新技术) | 600 | 800 |
Design Spec | 生成设计文档 | 50 | 60 |
Design Review | 设计复审 | 20 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
Design | 具体设计 | 40 | 50 |
Coding | 具体编码 | 40 | 60 |
Code Review | 代码复审 | 30 | 20 |
Test | 测试(自我测试,修改代码,提交修改) | 40 | 50 |
Reporting | 报告 | 30 | 30 |
Test Report | 测试报告 | 20 | 40 |
Size Measurement | 计算工作量 | 20 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 50 |
合计 | 1070 | 1500 |
二.解题思路
-
一开始没有思路,这题目是什么意思?json是什么?这文件里的数据是什么?但看到助教写的是python的示例代码,就赶紧去学python了。
-
学完基本的语法之后,就去学习了怎样解析 Json 文件,怎样统计Json文件里的数据。
-
开始写代码,边学边写,现学现卖,查找资料,了解 Python 如何解析 Json 文件,以及如何实现命令行参数。
综上所述,我从头开始学习了python的基本语法和它的几个库,实现了解析json文件的功能。
三.设计实现的过程
-
首先要把json读取出来,按类型写入不同的文件中,查找的时候效率就比较高。
-
接着就是按部就班的查找。
四.核心代码
首先是初始化函数,path为给定文件夹路径,通过os.path.splitext()函数可以得到一个由文件名和文件后缀组成的列表。
除了这种方法还可以通过i的切片[-4:]是否与'json'相同来寻找json文件
当函数结束时不要忘记关闭文件
def Begin(path):
pe = open('PushEvent.json','w',encoding='utf-8')
ic = open('IssueCommentEven.json','w',encoding='utf-8')
ie = open('IssuesEvent.json','w',encoding='utf-8')
pr = open('PullRequestEvent.json','w',encoding='utf-8')
file = os.listdir(path)#得到文件列表
for i in file:
if (os.path.splitext(i)[1] == '.json'):#os.path.splitext(i)返回一个列表,首个元素为文件名。第二个元素为文件类型
with open(path+"//"+i, 'r', encoding='utf-8') as f:
for jsonstr in f.readlines(): #根据读到数据的不同将数据写入不同文件
date = json.loads(jsonstr)
if(date['type'] == 'PushEvent'):
pe.write(json.dumps(date))
pe.write('\n')
elif(date['type']=='IssueCommentEvent'):
ic.write(json.dumps(date))
ic.write('\n')
elif(date['type']=='IssuesEvent'):
ie.write(json.dumps(date))
ie.write('\n')
elif(date['type']=='PullRequestEvent'):
pr.write(json.dumps(date))
pr.write('\n')
pe.close()
ic.close()
ie.close()
pr.close()
查找函数,因为在初始化函数中创建的类型数据文件与数据类型相同,所以查找时可以直接以event +.json的形式访问到该文件,值得注意的是测试程序初始化时输出0,为了保持一致我们也要在相应的情况输出0
def FindNum(name,repo,event):
#根据命令行参数实现查找功能
num=0
if(name==' ' and repo!=' '):#项目名参数为空时
with open(event+'.json', 'r', encoding='utf-8') as f:
for jsonstr in f.readlines():
date = json.loads(jsonstr)
if(date['repo']['name']==repo):
num=num+1
elif(repo==' ' and name !=' '):#用户名名参数为空时
with open(event+'.json', 'r', encoding='utf-8') as f:
for jsonstr in f.readlines():
date = json.loads(jsonstr)
if(date['actor']['login']==name):
num=num+1
elif(repo!=' ' and name !=' '):#查询某项目中某用户某类型事件
with open(event+'.json', 'r', encoding='utf-8') as f:
for jsonstr in f.readlines():
date = json.loads(jsonstr)
if(date['actor']['login']==name and date['repo']['name']==repo):
num=num+1
#初始化输出0
print(num)
主函数:
if __name__ == '__main__':
if('-i' in sys.argv):#根据命令行信息为参数赋值
Begin(sys.argv[sys.argv.index('-i')+1])
elif('--init' in sys.argv):
Begin(sys.argv[sys.argv.index('--init')+1])
if('-u' in sys.argv):
username = sys.argv[sys.argv.index('-u')+1]
elif('--user' in sys.argv):
username = sys.argv[sys.argv.index('--user')+1]
else:
username = ' '
if('-r' in sys.argv):
userepo = sys.argv[sys.argv.index('-r')+1]
elif('--repo' in sys.argv):
userepo = sys.argv[sys.argv.index('--repo')+1]
else:
userepo = ' '
if('-e' in sys.argv):
event=sys.argv[sys.argv.index('-e')+1]
elif('--event' in sys.argv):
username = sys.argv[sys.argv.index('--event')+1]
else:
event = ' '
FindNum(username,userepo,event)#调用函数findunm
五.迭代过程
优化了对json文件读取时的存放,将其分类,提高了查找效率。
六.困难描述及解决办法寻找
-
首先是对python的熟练度不够,在努力之下三天学完python的基本语法。
-
其次是不了解json文件的处理方式,查找了很多资料后对json处理的规范有了一定的了解。
-
github,助教给的脚本,一开始都是不会用的,问了大佬才知道怎么用。
七.代码规范
https://github.com/LearninGggggg/LearninGggggg/blob/master/codestyle.md
八.总结
在这次实践中学到了很多东西,最重要的就是在python上基本入了门,同时也了解了一部分github的使用。
从刚拿到作业时的懵逼,到现在有了对json文件处理的基本了解,并且对python的使用熟练度上升了,虽然码代码时很痛苦,但是写完之后很有成就感,期待下一次的软工作业。