20193120 实验四 Python综合实践

设计初衷:

程序设计来是面向实际使用过程的,不是为了程序而设计程序。
期末考试临近,最初记录平时作业成绩的时候,没有把每次分数统计的Excel表格整合在一起,最后老师需要课代表把所有的平时作业成绩汇总到一个Excel中。如果是人工统计数据并填入,将非常麻烦且耗时,人做这种事情,做的时间长了,还容易粗心,可能会导致错误。而程序在设计合理的情况下,很难发生错误,准确率远超人类。
因此这个代码的目的在于大量节约时间,只要按照规定的格式写入成绩,不论是多少个Excel表格组,只要运行程序,就能自动写入数据到已设计好的表格中。

过程如下:

1:首先是Excel的版本问题

关键在于读取Excel的数据和写入Excel的数据。
原本用于记分的模板为老版本的Excel,无法使用openpyxl进行操作。

用来读取同学名字和写入数据的Excel为同一个,都是老版本的,openpyxl不适用。
解决办法:使用import xlrd读取数据。

2:进行初步实验,完成第一步。

先编写代码,让其能读取Excel中31班所有同学的名字并输出,这样才能找到其每次作业的分数。
通过xlrd的xxx.cell(row,column).value 获得指定位置的数据,由于放置班级成员名字时,都有一定的存放规律(例如下图所示的意思就是名字都放在了同一列),按照这个规律一个个读取即可。

由于这里涉及他人隐私,故将读取后的结果放在了蓝墨云班课提交的word文档上。

设计完成后,成功读取到所有人的名字。

3:读取成功

现在每当读取到一个人的名字之后,要让程序打开若干个记录着高数成绩的文件,提取每个同学对应的分数。
为了方便提取文件,将第n次平时成绩汇总的表格命名为n.xlsx(0.xlsx是为了备份,备份原因在下面会提到),这样就能公式化读取。

tar.xls是读取部分数据的地方,也是出结果的地方。
这里发生了一个小插曲,在读取成绩的代码中,出现了错误。

一半人的数据还未读取完,程序就异常终止。

原来这段话其实写的是str(i+1),而i的范围是3~34,所以会报错,因为系统根本找不到15.xlsx
改成j之后,程序恢复正常,成功读取到每个同学对应的分数。

(通过这个程序,也找到了部分没有填入成绩的同学,最后查消息记录,都补上去了)

4:紧接着需要把读取到的数据写入到文件中。

由于文件是老版本的Excel,所以只能用xlwt和xlrd来解决。
另外,在给Excel文件追加内容的时候,需要import xlutils,否则只能重新写一个新的文件。该模块需要手动安装。
之前由于读取的文件后缀为xlsx,所以产生了记录分数错误的严重bug,情况如下:


最后一排数据正确输入,其他数据均为错误数据。
原因在于用来提供数据的文件tar.xlsx损坏。

更改办法:由于使用xlwt和xlrd读取后缀为xlsx文件时,导致文件损坏,所以应该改成读取xls后缀的文件,就能恢复正常。

上面是错误的写法,会导致文件损坏无法打开,之前没有对此文件进行备份,
导致差点让整个文件的数据都丢失了。
下面的写法即可避免错误,同时也可以打开文件查看结果。

运行的时候不要打开目标文件(tar.xls)否则会引发permission denied,程序将无法访问表格。

文件要记得保存。

同样不能保存为.xlsx,否则无法打开查看最后结果。

程序代码放到了码云托管:https://gitee.com/i_am_yu/ultimate/blob/master/main.py

运行结果:

经过调试,最后程序正常运行,运行结果如下:
先把需要的文件放到指定文件夹中:

然后运行程序,结果如下:

经过校验,程序中输出的分数确实为原来14个Excel上记录的分数,至此程序实现了目标功能。
稍微对代码进行修改,即可统计若干次成绩并写入到该表格中。
修改之后,只要输入需要统计的次数,并把文件放到指定的位置,就能自动填入。

总结:

Python是一种相对好入门的语言,但要是真正把握它却不容易。
例如,对于排序,Python只需要用一个sorted就能解决,C语言就需要用各种类型的排序算法,专门编写一串代码解决。
所以Python应该拿来做更高级的事情。
刚开始学习的内容和C语言差不多,很多都能在C语言上办到。
到后来,列表,元组,字典,这些C语言上都见不到。
Python提供的部分函数能很方便的操作,例如如果想要在背后插入一个数据,只需要用append()办法,而C语言就复杂了。
接着是正则表达式和字符串的处理,这些放到C语言上都比较麻烦。
函数,C语言和Python都有的功能,但C语言一次只能携带一个返回值,必须用指针才能携带回多个返回值,而Python可以同时带回多个返回值,同时其函数的功能相比于C语言更强大,更方便。
于是来到了面向对象的设计,class,try,import和文件的操作。这里感受最深的就是文件操作,用Python提供的xlwt,xlrd和openpyxl,就能解决处理Excel文件的问题。
数据库,网络爬虫,前者广泛用于生活当中,后者如果使用得当,可以帮助你在海量数据中提取关键数据。socket编程,使得程序运行的对象从一个计算机,可以延伸到多个计算机当中。
课外部分,还学习了pygame和GUI的制作,通过学习课外部分,程序能力获得进一步提升。尤其是图形用户界面,如果没有它,就好像用cmd对文件进行操作,查看和对文件操作都非常麻烦。
课程结束了,但程序设计的过程并未结束。如果有时间,还会加强对Python编程能力的训练。

建议:

在课堂上让同学编写一些代码,加强训练。不必编写很复杂的代码,目的只是让同学们掌握如何使用。
由于Python主要是函数名比较难记,以import re为例,里面就有很多需要背的函数,例如re.match,re.sub,所以说在练习的时候推荐有提示。

posted @ 2020-06-14 14:45  compile_error  阅读(202)  评论(0编辑  收藏