我正在努力为员工和学生创建一个基于网络的学校时间表视图。我正在使用Django 1.8将其输出到表中,如果这有任何区别的话。
示例学生CSV文件:http://pastebin.com/Jf8My0RH 示例教师CSV文件:http://pastebin.com/ie3qeT3R
所有数据都存储在多个CSV文件中。我的学生时间表工作正常,使用下面的代码:
def get_timetable(StudentCode):
timetable = []
with open(TT_BASE_DIR + 'NStudTT.txt') as student_timetable:
reader = csv.DictReader(student_timetable, fieldnames=("StudentName","StudentCode","DayNo","PeriodNo","ClassCode","TeacherCode","RoomCode","RollClassCode","LessonType"))
for row in reader:
if row['StudentCode'] == StudentCode:
for day in range(11):
if int(row['DayNo']) == day:
timetable.append(row)
return(timetable[x:x+10] for x in range(0, len(timetable),10))
这将返回一个包含10个列表的列表,每个列表包含10个字典项,我可以将它们输出到表中。
我想为老师做同样的事情,但他们并不总是有完整的时间表。这是我用来从CSV文件中获取数据的代码:
def get_teacher_timetable(TeacherCode):
timetable = []
with open(TT_BASE_DIR + 'NTRTimeT.txt') as teacher_timetable:
reader = csv.DictReader(teacher_timetable, fieldnames=("TeacherCode", "RoomCode", "DayNo", "PeriodNo", "RollClassCode", "ClassCode"))
for row in reader:
if row['TeacherCode'] == TeacherCode:
for day in range(11):
if int(row['DayNo']) == day:
timetable.append(row)
return(temp_timetable)
我可以让它在单个词典列表中返回所有项目。我需要做的是按 DayNo 对字典进行分组,然后将每个组插入一个新列表。但是我想根据 PeriodNo 将条目插入到列表中。因此,如果在第4期中有备用,它将创建一个NULL元素,或者#34;"等等。最后,我应该有一个包含10个列表的列表,每个列表有10个课程/ null
我想做的是什么?
答案 0 :(得分:1)
查看您的示例数据,似乎数据将按TeacherCode,DayNo,PeriodNo排序,因此我的解决方案同样如此。
为简化起见,首先过滤reader
数据结构,使其仅包含相关行。
使用2 for循环遍历每一天和每个时段。如果存在相应的行,请将该行添加到计划中。如果没有,请创建一个包含适当空格的新词典,并将其添加到计划中。
我没有在返回时编译列表列表,而是使用列表将所有时间段追加到一天,然后在每天之后将该列表附加到完整的时间表。
以下是代码:
def get_teacher_timetable(TeacherCode):
timetable = []
with open(TT_BASE_DIR + 'NTRTimeT.txt') as teacher_timetable:
reader = csv.DictReader(teacher_timetable, fieldnames=("TeacherCode", "RoomCode", "DayNo", "PeriodNo", "RollClassCode", "ClassCode"))
rows = iter([row for row in reader if row['TeacherCode'] == TeacherCode])
row = next(rows,None)
for day in range(1,11):
day_schedule = []
for period in range(1,11):
if row and int(row['DayNo']) == day and int(row['PeriodNo']) == period:
day_schedule.append(row)
row = next(rows,None)
else:
new_row = {"TeacherCode":TeacherCode, "RoomCode":"", "DayNo":day, "PeriodNo":period, "RollClassCode":"", "ClassCode":""}
day_schedule.append(new_row)
timetable.append(day_schedule)
return(timetable)
如果有更好的方法来遍历数据,请告诉我。