软工第一次编程作业
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/SE2020/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/SE2020/homework/11167 |
这个作业的目标 | <制作一个程序统计和分析 GitHub 的用户行为数据> |
学号 | <031802439> |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
Estimate | 估计这个任务需要多少时间 | ||
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 1200 | 900 |
Design Spec | 生成设计文档 | 20 | 20 |
Design Review | 设计复审 | 10 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
Design | 具体设计 | 60 | 50 |
Coding | 具体编码 | 10 | 10 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 30 | 30 |
Reporting | 报告 | 20 | 20 |
Test Report | 测试报告 | 15 | 15 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 1455 | 1150 |
解题过程
1.首先对需求进行分析,因为对C++,Java,Python三门语言都不熟,所以选择最容易上手的Python作为实验语言
2.对题目进行分析,很明显我们需要对json文件进行解析将其转换为程序语言可以处理的类型,对此我们要用到json模块
3.因为要通过命令行输入参数,所以要用自带的sys模块来读取命令行参数
4.
综合以上要点,我花了一段时间来学习python的基本语法,之后通过网上的资料编写了本次实践的代码。
因为对于python不熟悉,所以并没有用到第三方库而是python自带的库。
因为数据可能太大,为了防止内存不够,所以选择额外创建文件来储存信息
设计实现的过程
首先通过初始化函数来读取数据文件,并根据数据类型的不通写入不通的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文件进行处理,在实现了读取,写入功能之后才逐步添加os模块
来对整个文件夹进行处理、
困难描述及解决办法寻找
因为对于python不熟悉,所以在代码编写的过程中时常会犯下少:或者是缩进不对等
低级错误,不过在编程后期因为熟练度提升的原因这种错误逐渐减少。
对于json解析的不熟悉,导致最开始没有使用json.loads(jsonstr)
而是在for jsonstr in f.readlines():这一行之后直接对jsonstr进行处理
导致麻烦了很多,后来查阅了相关资料后使用json.loads(jsonstr)转化为字典
才成功处理
代码规范
https://github.com/zhangtingyi20/zhangtingyi20/blob/master/codestyle.md
总结
在这次实践中学到了很多东西,最重要的就是在python上基本入了门,同时
也了解了一部分github的使用,虽然仍旧不怎么熟练,但至少有了不小的进步
-------------------------------------------
个性签名:这里本来该有签名的,但我不想弄