目录
一、系列文章链接
(一):程序介绍和流程图
(二):主要文件main.py
(三):基础文件basics.py
(四):管理学生信息manage.py
(五):查询学生信息query.py
(六):导入数据文件import_data.py
(七):导出数据文件export_data.py
二、实现效果
(1)导入全部信息
表格中的数据
先导入数据,表格中的数据如下:
简单模仿了SQL Server的导入
导入全部信息,系统会遍历整个xls文件,左边的是文件中的表头,是文件自带的,不管文件中的是什么,只要我们找出数据库中和它对应的即可联系上,如左边是“学号”“学生的学号”,只要导入填的是“Sno”或“学号”就能成功。
课程表和选课表也是相同原理,全部导入完毕提示成功。
(2)导入科目成绩
表格中的数据
可以在导入全部信息后再分开导入科目成绩。
创建了一个语文成绩表,选取了导入全部信息中导入的三个已经存在的学生,加上三个新学生(当初新学生用了舍友的学号和名字,打了马赛克)
导入时的注意事项
如果课程不存在,将会提示是否创建。
文件中一定要有学生的学号和姓名,不然新学生无法被创建,因为学生表的学号和姓名是一定不能为空的。如果只有学生的学号的话,那么得确保文件中的学生之前已经在数据库中。
三、import_data.py的函数简介
def main( cn):
“”“调用import_all,import_one函数”""
def main_show():
“”“主函数的显示”""
def insert_students( cn, sno, sname):
“”“对学生表进行插入,区别与ba里的,这里不用自动插入Sclass”""
(1)导入全部信息
-
def import_all( cn):
“”“导入全部信息,调用all_的函数”""
#all的导入简单模仿了SQL Server的导入,需要自己输入导入到哪个表中,不然会出错 -
def all_students( cn, table):
“”“导入全部信息到 学生表 中”"" -
def all_courses( cn, table):
“”“导入全部信息到 课程表 中”"" -
def all_reports( cn, table):
“”“导入全部信息到 成绩表 中”""
(2)从header获取相应的信息,导入到三个表的操作
-
def import_students( cn, table, header):
“”“新的文件信息导入到 学生表 “”” -
def import_courses( cn, table, header):
“”“新的文件信息导入到 课程表 “”” -
def import_reports( cn, table, header, nead):
“”“新的文件信息导入到 成绩表 “””#nead是课程号,选课学年,选课学期是否需要输入
#如果nead中没有相应的key值,就需要从header中获取
#即不需要我们输入,在表格中本就存在
(3)导入单科成绩
- def import_one( cn):
“”“导入科目成绩”""
四、代码
import os
import xlrd
import basics as ba
def insert_students( cn, sno, sname):
"""对学生表进行插入,区别与ba里的,这里不用自动插入Sclass"""
sql = '''insert into Students (Sno, Sname)
values('%s','%s')
''' % ( sno, sname)
cn.execute( sql)
cn.commit()
#从header获取相应的信息,导入到三个表的操作
def import_students( cn, table, header):
"""新的文件信息导入到学生表"""
stu = [ 'Sgender','Sbirth','Sclass','Snative']
nrows = table.nrows #表的行数
for i in range( 1, nrows):
onerow = table.row_values(i)
sno = onerow[ header['Sno']]
sno = str(int(sno))
sname = onerow[header['Sname']]
sql = "SELECT DISTINCT Sname FROM Students " \
"WHERE Sno = '%s'" % sno
cursor = cn.execute( sql)
information = 0
for row in cursor:
information = row[0]
if information != 0:
if information != onerow[header['Sname']]:
print("数据库中的已经存在这个学号,"
"对应的姓名为'%s',"
"而导入文件中的姓名为'%s'" %
(information, onerow[header['Sname']]))
confirm = input("信息冲突,是否覆盖?"
"(包括学生表和成绩表)(Y/N)")
if confirm == 'y' or confirm == 'Y':
ba.del_students( cn, sno)
insert_students( cn, sno, sname)
else:
print("取消覆盖,这行略过")
continue
else:
insert_students( cn, sno, sname)
for key, value in header.items():
if key in stu:
if key == 'Sbirth':
x = xlrd.xldate_as_tuple( onerow[ value], 0)
day = x[0:3]
onerow[ value] = str(day