ИМХО, пришло время научиться отлаживать простые программы.Некоторые IDE поставляются с хорошими отладчиками, но вы все равно можете использовать старый добрый pdb
или просто добавить следы печати в свой код, чтобы легко понять, что происходит.
Здесь первая и наиболее очевидная проблема заключается в следующем:
tot = sum(1 for col in k)
Это довольно бесполезно, потому что for col in k
будет достаточно, но оно потребляет всю сумму итератора k
, поэтому в следующей строке for col in k:
попытайтесь получить доступ к итератору, который уже достиг своего концаи цикл немедленно останавливается.
Это еще не все:
- первая строка содержит
Student
с верхним регистром S
при тестировании student
с нижним регистром s
: это разные строки ... В этом случае проблемы возникают во всех других сравнениях. - когда вы находите
student
, вы устанавливаете a
на строку, следующую за ним ... и никогда не меняете ее,Поэтому, даже если вы исправите ошибки в своем деле, вы будете последовательно использовать эту единственную строку для студента!
Если вы новичок, правило будет Keep It Simple, Stupid .Поэтому начните с того, что вы можете контролировать, а затем начните добавлять другие функции:
- прочитайте входной файл с помощью модуля csv и просто распечатайте список для каждой строки.Не идите дальше, пока это не даст того, что вы хотите!Это остановило бы вас от
tot = sum(1 for col in k)
ошибки ... - идентифицирует каждого студента.Просто напечатайте его сначала, затем сохраните его имя в списке и распечатайте список после цикла
- идентификации предмета.Просто напечатайте их сначала, а затем напишите словарь с предметами
- , удивляйтесь, как вы можете получить это в конце цикла ...
- просто поймите, что вы можете сохранить имя студента в этомсловарь и поместите полный словарь в список (не стесняйтесь задавать новый вопрос, если вы застряли там ...)
- распечатать список словарей в конце цикла
- создайте одну строку для ученика, которая могла бы кормить писателя csv, или, поскольку у вас уже есть список диктов, рассмотрите возможность использования
DictWriter
.
Удачи в практике Python!
Вот возможный способ чтения части:
import csv
la = {} # use a dict to use the student name as index
with open("new.csv","r",newline='\n') as k:
k=csv.reader(k, delimiter=',', quotechar='_', quoting=csv.QUOTE_ALL)
# counter = 0 # pretty useless...
for col in k :
if col[0] =='student':
l2 = set() # initialize a set to store subjects
la[col[1]] = l2 # reference it in la indexed by the student's name
else: # it should be a subject line
l2.add(col[1]) # note the subject
# Ok la is a dict with studend names as key, and a set containing subjects for that student as value
print(la)
Для записи части вы должны:
- создать объединение всех наборов, чтобы получить все возможныесубъекты (если вы не знаете, что это)
- для каждого элемента (имя, субъекты) из la, создайте список, хранящий да или нет для каждого возможного субъекта
- запишите этот список в вывод csvфайл
... оставлен как упражнение ...