软工第一次编程作业

这个作业属于哪个课程 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.参数为文件夹,所以需要导入os模块
综合以上要点,我花了一段时间来学习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的使用,虽然仍旧不怎么熟练,但至少有了不小的进步

posted on 2020-09-16 20:20  张廷宜  阅读(169)  评论(2编辑  收藏  举报

导航