根据值

时间:2015-09-29 04:09:07

标签: python csv python-3.x

我正在努力为员工和学生创建一个基于网络的学校时间表视图。我正在使用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

我想做的是什么?

1 个答案:

答案 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)

如果有更好的方法来遍历数据,请告诉我。