|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这是一个学生成绩管理系统,新手的第一个小项目,使用openpyxl模块来进行excel的读写操作。这里遇到了一个问题:
我在修改学生对象的成绩属性(一个字典)的时候,出现了一个神奇的BUG,具体如图:
我使用了两句一模一样的打印学生成绩的语句,而这两句的运行结果截然不同!
前一句打印正常的,每个人的成绩
后一句打印错误的,只有一个人的成绩还重复打印了54遍
各位看217行。。
原代码(未完工的半成品,仅仅能够跑起来的程度,复用性可读性极差,各位轻喷):
- import openpyxl as opx #导入openpyxl
- import sys
- class_name = ' '
- class Classes: #创建“班级”类
- class_name = ' ' #设置班级名字
- temp = {} #设置临时存放学生信息的字典
- students_info = {} #设置存放学生信息的字典
- count_students = 0 #学生计数器
- students_num = [0] #学生的学号
- exam_name = [] #班级所进行的考试的名称
- def __init__(self): #重写__init__方法
- print("执行初始化程序......")
- self.class_name = input("请设置班级名称:") #新建班级信息
- print("第一次新建班级,需要导入学生信息!")
- print("需要导入带有任意学生信息的文件(号数+姓名)")
- print("例如,在'半期考.xlsx'中含有学生的号数和姓名,则导入该文件即可")
- print(r"输入格式如下 ---> D:\Users\kitur\Documents\Desktop\高二(1)\第二次月考(2).xlsx") #导入学生信息
- path = input("请输入文件路径(包含名称):\n")
- wb = opx.load_workbook(path) #打开excel工作簿
- for each_sheet in range(len(wb.sheetnames)):
- ws = wb[wb.sheetnames[each_sheet]] #查找学生的号数与其对应的学生名称,并保存在temp中
- for each_row in range(2,10):
- cells = ws['A' + str(each_row):'Z' + str(each_row)]
- for each_cell in cells[0]:
- if each_cell.value == "座号" or each_cell.value == "号数":
- while each_cell.value != None:
- num = each_cell.value
- name = each_cell.offset(0,1).value
- self.count_students += 1
- self.temp[num] = name
- each_cell = each_cell.offset(1)
- if len(self.temp) == 0:
- print("导入的文件中没有学生信息")
- for each_num in range(1,len(self.temp.keys())): #由于输入的数据可能不是排序好的,所以在这里排序一下再存放到students_info中
- self.students_info[each_num] = self.temp[each_num]
- self.students_num.append(each_num)
- self.students_num[each_num] = Students(self.students_info[each_num])
- print("学生信息导入成功!")
- print("使用className.import_exam来导入成绩!")
- self.import_exam()
- def import_exam(self): #定义导入成绩的方法
- chinese_score_dict = {"name":"语文"} #创建一大堆存放学生成绩的字典
- chinese_grade_rank_dict = {"name":"语文段次"}
- math_score_dict = {"name":"数学"}
- math_grade_rank_dict = {"name":"数学段次"}
- english_score_dict = {"name":"英语"}
- english_grade_rank_dict = {"name":"英语段次"}
- physics_score_dict = {"name":"物理"}
- physics_grade_rank_dict = {"name":"物理段次"}
- biology_score_dict = {"name":"生物"}
- biology_grade_rank_dict = {"name":"生物段次"}
- geography_score_dict = {"name":"地理"}
- geography_grade_rank_dict = {"name":"地理段次"}
- history_score_dict = {"name":"历史"}
- history_grade_rank_dict = {"name":"历史段次"}
- politics_score_dict = {"name":"政治"}
- politics_grade_rank_dict = {"name":"政治段次"}
- pe_score_dict = {"name":"体育"}
- pe_grade_rank_dict = {"name":"体育段次"}
- total_score_dict = {"name":"折后总分"}
- grade_rank_dict = {"name":"总分段次"}
- class_rank_dict = {"name":"总分班次"}
- exam_name = input("请输入考试的名字(如:期末考):")
- self.exam_name.append(exam_name) #存储考试名称
- print("请输入成绩文件保存的位置")
- print(r"输入格式如下 ---> D:\Users\kitur\Documents\Desktop\高二(1)\第二次月考(2).xlsx")
- path = input() #输入考试信息文件的路径
- wb = opx.load_workbook(path)
- print("有如下sheets,导入哪个?")
- for each_sheet in wb.sheetnames:
- print(each_sheet)
- #import_sheet = input("请输入:")
- import_sheet = 'Sheet1'
- ws = wb[import_sheet] #打开考试文件的工作表
- cells = ws['A1':'Z3']
- for each_row in cells: #注释实在写不下去了,我真的不知道应该怎么表达我写的这什么**玩意儿
- for each_cell in each_row:
- if each_cell.value != None:
- if type(each_cell.value) == str:
- if each_cell.value == "座号" or each_cell.value == "号数":
- num_start = each_cell.offset(1)
- if "语文" in each_cell.value:
- if "段" in each_cell.value:
- chinese_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- chinese_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if "数学" in each_cell.value:
- if "段" in each_cell.value:
- math_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- math_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if "英语" in each_cell.value:
- if "段" in each_cell.value:
- english_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- english_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if "物理" in each_cell.value:
- if "段" in each_cell.value:
- physics_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- physics_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if "生物" in each_cell.value:
- if "段" in each_cell.value:
- biology_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- biology_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if "地理" in each_cell.value:
- if "段" in each_cell.value:
- geography_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- geography_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if each_cell.coordinate == 'Z3':
- if geography_score_col == None:
- geography_score_col = -1
- if geography_grade_rank == None:
- geography_grade_rank = -1
- if "历史" in each_cell.value:
- if "段" in each_cell.value:
- history_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- history_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if each_cell.coordinate == 'Z3':
- if history_score_col == None:
- history_score_col = -1
- if history_grade_rank == None:
- history_grade_rank = -1
- if "政治" in each_cell.value:
- if "段" in each_cell.value:
- politics_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- politics_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if each_cell.coordinate == 'Z3':
- if politics_score_col == None:
- politics_score_col = -1
- if politics_grade_rank == None:
- politics_grade_rank = -1
- if "体育" in each_cell.value:
- if "段" in each_cell.value:
- pe_grade_rank = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- pe_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if each_cell.coordinate == 'Z3':
- if pe_score_col == None:
- pe_score_col = -1
- if pe_grade_rank == None:
- pe_grade_rank = -1
- else:
- pe_grade_rank = -1
- pe_score_col = -1
- if each_cell.value == "折后总分":
- total_score_col = opx.cell.cell.get_column_letter(each_cell.column)
- if each_cell.value == "段排" or each_cell.value == "段次" or each_cell.value == "年段排名" or each_cell.value == "总分段排" or each_cell.value == "总分段次":
- grade_rank_col = opx.cell.cell.get_column_letter(each_cell.column)
- if each_cell.value == "班排" or each_cell.value == "班次" or each_cell.value == "班级排名" or each_cell.value == "总分班排":
- class_rank_col = opx.cell.cell.get_column_letter(each_cell.column)
- else:
- class_rank_col = -1
- while num_start.value != None: #存储成绩
- i = num_start.value
- chinese_score_dict[i] = ws[str(chinese_score_col) + str(num_start.row)].value
- chinese_grade_rank_dict[i] = ws[str(chinese_grade_rank) + str(num_start.row)].value
- math_score_dict[i] = ws[str(math_score_col) + str(num_start.row)].value
- math_grade_rank_dict[i] = ws[str(math_grade_rank) + str(num_start.row)].value
- english_score_dict[i] = ws[str(english_score_col) + str(num_start.row)].value
- english_grade_rank_dict[i] = ws[str(english_grade_rank) + str(num_start.row)].value
- physics_score_dict[i] = ws[str(physics_score_col) + str(num_start.row)].value
- physics_grade_rank_dict[i] = ws[str(physics_grade_rank) + str(num_start.row)].value
- if biology_score_col != -1:
- biology_score_dict[i] = ws[str(biology_score_col) + str(num_start.row)].value
- #if biology_grade_rank != -1:
- #biology_grade_rank_dict[i] = ws[str(biology_grade_rank) + str(num_start.row)].value
- if geography_score_col != -1:
- geography_score_dict[i] = ws[str(geography_score_col) + str(num_start.row)].value
- #if geography_grade_rank != -1:
- #geography_grade_rank_dict[i] = ws[str(geography_grade_rank) + str(num_start.row)].value
- if history_score_col != -1:
- history_score_dict[i] = ws[str(history_score_col) + str(num_start.row)].value
- #if history_grade_rank != -1:
- #history_grade_rank_dict[i] = ws[str(history_grade_rank) + str(num_start.row)].value
- if politics_score_col != -1:
- politics_score_dict[i] = ws[str(politics_score_col) + str(num_start.row)].value
- #if politics_grade_rank != -1:
- #politics_grade_rank_dict[i] = ws[str(politics_grade_rank) + str(num_start.row)].value
- if pe_score_col != -1:
- pe_score_dict[i] = ws[str(pe_score_col) + str(num_start.row)].value
- #if pe_grade_rank != -1:
- #pe_grade_rank_dict[i] = ws[str(pe_grade_rank) + str(num_start.row)].value
- if class_rank_col != -1:
- class_rank_dict[i] = ws[str(class_rank_col) + str(num_start.row)].value
- total_score_dict[i] = ws[str(total_score_col) + str(num_start.row)].value
- grade_rank_dict[i] = ws[str(grade_rank_col) + str(num_start.row)].value
- num_start = num_start.offset(1)
-
- score_save = "exam1"
- if score_save == "exam1":
- for i in range(1,len(self.students_num)):
- self.students_num[i].exam1["exam_name"] = self.exam_name[-1]
- if score_save == "exam2":
- for i in range(1,len(self.students_num) + 1):
- self.students_num[i].exam2["exam_name"] = self.exam_name[-1]
- if score_save == "exam3":
- for i in range(1,len(self.students_num) + 1):
- self.students_num[i].exam3["exam_name"] = self.exam_name[-1]
- if score_save == "exam4":
- for i in range(1,len(self.students_num) + 1):
- self.students_num[i].exam4["exam_name"] = self.exam_name[-1]
- if score_save == "exam5":
- for i in range(1,len(self.students_num) + 1):
- self.students_num[i].exam5["exam_name"] = self.exam_name[-1]
-
- for i in range(1,54): #(重点来了,这里报错)将学生的成绩(这里我只导入了语文)导入到学生的成绩表中
- self.students_num[i].exam1["语文"] = chinese_score_dict[i]
- self.students_num[i].exam1["student_num"] = i
- print(self.students_num[i].exam1) #打印这个学生的成绩表
- for i in range(1,54):
- print(self.students_num[i].exam1) #再次打印,因为发现了这个bug。。
- class Students():
- name = "空"
- group = ' '
- exam1 = {}
- exam2 = {}
- exam3 = {}
- exam4 = {}
- exam5 = {}
-
- def __init__(self,name):
- self.name = name
-
-
- C1 = Classes()
复制代码
|
|