1、问题
根据需求,该系统所应包含的信息有以下一些:
学生提交作业情况slsx:
学号,姓名,第一次作业,第二次作业,第三次作业
共有3次作业。
根据需求,该系统所应实现的功能有以下一些:
1)找到作业所在位置,遍历三次作业
2)根据学号或者姓名得出作业提交情况
3)将三次未交作业学生的学号分别输出,并将每个学生作业的完成与否输出
4)将作业完成情况导入Excel表格中
2、系统
采用Pycharm实现,开发环境为python3.6,可以运行在操作系统windows98及以上皆可。
3、运行要求
1.能准确导出学生作业的提交与否
2.能准确将作业提交情况导入Excel表格中
1、系统流程设计
根据系统要求,设计如下的系统流程:
`
2、系统模块设计
根据系统的功能设计如下模块:
1.整理学生名单和作业
(1)统计学生名单,如下图:
(2)将三次作业分别存放在不同的文件夹中:
2.运行显示和导入Excel并导出饼图直观表示作业提交情况
根据作业统计的需要,需要导出每次作业的提交情况,并统计所有同学三次作业的完成与否。
每次作业运行显示如图所示,并统计其提交率:
总计三次作业的总和:
选择是否导出Excel:
导出Excel:
生成三次作业提交情况的饼图,直观表示结果:
3.模块实现
(1)获取指定文件夹下的文件名
首先导入os模块
Python获取指定文件夹下的文件名可以采用os.walk()和os.listdir()两种方法。
os.walk():
模块os中的walk()函数可以遍历文件夹下所有的文件。该函数可以得到一个三元tupple(dirpath, dirnames, filenames)。其中参数含义:
dirpath:string,代表文件夹所在路径;
dirnames:list,包含了当前dirpath路径下所有的子文件夹名(不包含路径)
filenames:list,包含了当前dirpath路径下所有的包括子文件下的文件名(不包含路径)。
os.listdir():
os.listdir()函数得到的是仅当前路径下的文件名,不包括子文件夹中的文件,所有需要使用递归的方法得到全部文件名。
代码如下:
def listdir(path, list1): # 获取指定文件夹下的文件名,并将文件名储存在list1中,形成一个列表 for file in os.listdir(path): # 判断文件名是否为doc或者docx if os.path.splitext(file)[1] == '.doc' or os.path.splitext(file)[1] == '.docx': # 特定类型的文件需要用os.path.splitext()函数将路径拆分,拆分为文件名和拓展名,[0]表示文件名,[1]表示拓展名 list1.append(file) # 如果是两者中的一种,则将其加在列表中
(2)Python操作Excel文档
其次导入xlrd和xlwt两个模块
使用xlrd模块读取Excel:
data = xlrd.open_workbook(‘test.xlsx’) # 打开当前目录下名为test的文档,即学生信息
xlwt模块将信息写入Excel :
workbook = xlwt.Workbook(encoding=‘utf-8’)
创建一个workbook 设置编码。Workbook()是构造函数,返回一个工作薄的对象。
sheet_test = workbook.add_sheet(‘sheet_test’, cell_overwrite_ok=True)
用cell_overwrite_ok=True实现对单元格的重复写
sheet_test.write(0, 0, ‘学号’) # 将学号写入Excel中
sheet_test.write(0, 1, ‘姓名’) # 将姓名写入Excel中
输出学生作业统计的饼图:
然后导入pyecharts模块:
#将三次作业提交情况做成饼图: examples = ['已提交', '未提交'] all_homework[i], num = single(list1)
引用single函数,将三次作业完成情况导出来
pie = Pie() pie.add("", [list(z) for z in zip(examples, num)]) pie.set_colors(["#38E737","#FF3366"]) pie.set_global_opts(title_opts=opts.TitleOpts(title="Pie-设置颜色")) pie.render("{}_pie.html".format(i))
(3)将所有模块合并起来
定义两个函数:
def single(list1):作为一次作业的函数
def single(list1): data = xlrd.open_workbook('test.xlsx') # 打开当前目录下名为test的文档,即学生信息 # 获得工作表 table = data.sheet_by_name('Sheet1') # 通过名称获取,即读取sheet1表单, # 也可以table = data.sheet_by_index(0)通过索引获取,例如打开第一个sheet表格 # 还可以table = data.sheets()[0]#通过索引顺序获取 nrows = table.nrows # 获取该sheet1表格中的有效行数 student = {} # 将student{}作为一个字典存取数据 for i1 in range(1, nrows): # 从第二行开始有所需要的数据 xuehao = table.cell_value(i1, 0) # 获取单元格中的学号 name = table.cell(i1, 1).value # 获取单元格中的姓名 # 获取单元格内容的三种方式: # table.cell(i,j).value # table.cell_value(i,j) # table.row(i)[j].value xuehao = int(xuehao) # 将浮点数转化为整数 student[xuehao] = 0 # 默认字典中学号对应0,即未交作业 for zuoye in list1: # 遍历每一份作业 if str(xuehao) in zuoye or name in zuoye: # 如果出现学号或者姓名,则认为交了作业 student[xuehao] = 1 # 记为1,认为交了作业 print("未交学生的学号:") list2 = [] # 新建列表计算未交作业个数 for key, values in student.items(): # 用items() 函数遍历(键, 值) 元组数组,key表示学号,value表示是否交作业 if values == 0: list2.append(key) print(key, end="\n") # 输出未交学生的学号 a = len(list2) b = (30 - a) / 30 * 100 print('提交人数:', 30 - a) print('未提交人数:', a) print('提交率为:', b, '%') # 计算提交率 print('*' * 40) list_all = [len(list1), len(list2)] return student, list_all
def multiple(all_homework):作为多次作业的函数
def multiple(all_homework): date = xlrd.open_workbook('test.xlsx') # 打开当前学生名单 table = date.sheet_by_name('Sheet1') # 通过名称获取,即读取sheet1表单s # 也可以table = data.sheet_by_index(0)通过索引获取,例如打开第一个sheet表格 # 还可以table = data.sheets()[0]#通过索引顺序获取 nrows = table.nrows # # 获取该sheet1表格中的有效行数 workbook = xlwt.Workbook(encoding='utf-8') # 创建一个workbook 设置编码。Workbook()是构造函数,返回一个工作薄的对象。 sheet_test = workbook.add_sheet('sheet_test', cell_overwrite_ok=True) # 用cell_overwrite_ok=True实现对单元格的重复写 sheet_test.write(0, 0, '学号') # 将学号写入Excel中 sheet_test.write(0, 1, '姓名') # 将姓名写入Excel中 n = 2 # 从第三列开始储存每次作业的情况 for i in homework: # 遍历每次作业 sheet_test.write(0, n, i) student = all_homework[i] for i1 in range(1, nrows): xuehao = table.cell(i1, 0).value # 获取学号单元格的值 stuname = table.cell(i1, 1).value # 获取姓名单元格的值 sheet_test.write(i1, 0, xuehao) sheet_test.write(i1, 1, stuname) sheet_test.write(i1, n, student[xuehao]) # 将完成与否填入表格中 n = n + 1 workbook.save('C://Users/xuyip/Desktop/作业统计.xlsx')
将sheet保存到test2.xlsx文件中
通过如下代码实现从一次作业推广到多次作业:
all_homework[i], num = single(list1)
引用single函数,将三次作业完成情况导出来
(4)输出结果并导出Excel
通过简单的输入输出,实现是否导出Excel
print(all_homework) # 打印出最后的作业结果 a = int(input('是否生成excel文件?1是2否')) if a == 1: multiple(all_homework) # 将统计的多次作业,储存在test.xls文件 print('文件已生成到桌面,谢谢使用!') else: print('谢谢使用!') print('饼图已经在原文件中生成,请注意查收')
本学期实训课与Python语言课相结合,以上机实验操作为主,加深了我对Python语言的理解和运用能力,帮助我解决了许多Python语言学习时遇到的问题。通过在学习时遇到的问题查找资料使我接触和了解了更多课本以外的知识。特别是最后的大实训,让我对所学的知识进行了实战应用,加深了对知识的理解,让我认识到实践的重要性,同时还得出一个结论:知识必须通过应用才能实现其价值!有些东西以为学会了,但真正到用的时候才发现是两回事,所以我认为只有到真正会用的时候才是真的学会了。
在完成本次课设后,我会更加热爱Python语言的学习,广泛的把其应用到个个学习的地方,我会继续努力的!
该程序的亮点是运用两个函数遍历了多次作业,并结合Excel将作业提交情况导入其中。
优点:
1.创新性的将饼图导入其中,使得到的数据更加的直观亮眼,思路清新
1.代码条理性强,每条代码注释详细,来源有根有据
2.将输出率进行了输出,使得到的结果更简单易懂,更具比较性
3.用户自主选择是否导出Excel,减少不必要的麻烦,使程序更加人性化
4.巧妙地解决了xlrd模块中默认输出浮点数的问题,使输出数据更既美观
xuehao = int(xuehao):将浮点数转化为整数**
不足之处:
没有更加具体的研究学生所交作业中word的完整性和是否存在抄袭行为,还需继续研究和创新!
**
**
这里是我完整的代码和实验报告答辩论文,有需要的同学可以自取:
作业统计管理系统源码+答辩论文