парсинг CSV в Python и запись в другой CSV, да, есть выбор, и нет, если выбор отсутствует - PullRequest
0 голосов
/ 11 марта 2019

Вход (new.csv:)

student Jack

Choice Phy

Choice Chem

Choice  Maths

Choice  Biology

student Jill

Choice  Phy

Choice  Biology

Choice  Maths

Ожидаемый результат (out.csv)

Student  Phy     Chem   Maths   Biology

Jack     Yes     Yes      Yes   Yes

Jill    Yes      No       Yes   Yes

Синтаксический анализ new.csv и запись результата в out.csv. Для каждого имени студента пишите YES, если имеется выбор предмета, и NO, если предмет отсутствует в выборе (предметы становятся новым заголовком из .csv). Здесь я использовал nested, чтобы получить желаемый результат. Пожалуйста, помогите мне с лучшим питоническим способом кода. Я новичок в Python. Хочу узнать лучший способ кодирования. П.С .: Выбор предметов не в том же порядке.

import csv
la =[]
l2=[]
with open("new.csv","r",newline='\n') as k:
     k=csv.reader(k, delimiter=',', quotechar='_', quoting=csv.QUOTE_ALL)
     counter = 0
     for col in k :
           # number of rows in csv is 600      
            if counter<=600:

                if col[0] =='student':

                        la.append("\n "+col[1])
                        a=next(k) 


                       if a[1] == 'Phy':
                            la.append('yes')
                            a = next(k)

                        else:
                            la.append('no')

                        if a[1] == 'Chem':
                             la.append('yes')
                             a = next(k)
                        else:
                             la.append('no')

                        if a[1] == 'Maths':
                           la.append('yes')
                           a = next(k)
                        else:
                             la.append('no')

                        if a[1] == 'Biology':
                            la.append('yes')
                            a = next(k)
                            counter += 1

                        else:
                            la.append('no')
                            counter += 1        

l2=",".join(la)

with open("out.csv","w") as w:
    w.writelines(l2) 

1 Ответ

0 голосов
/ 11 марта 2019

ИМХО, пришло время научиться отлаживать простые программы.Некоторые 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 .Поэтому начните с того, что вы можете контролировать, а затем начните добавлять другие функции:

  1. прочитайте входной файл с помощью модуля csv и просто распечатайте список для каждой строки.Не идите дальше, пока это не даст того, что вы хотите!Это остановило бы вас от tot = sum(1 for col in k) ошибки ...
  2. идентифицирует каждого студента.Просто напечатайте его сначала, затем сохраните его имя в списке и распечатайте список после цикла
  3. идентификации предмета.Просто напечатайте их сначала, а затем напишите словарь с предметами
  4. , удивляйтесь, как вы можете получить это в конце цикла ...
  5. просто поймите, что вы можете сохранить имя студента в этомсловарь и поместите полный словарь в список (не стесняйтесь задавать новый вопрос, если вы застряли там ...)
  6. распечатать список словарей в конце цикла
  7. создайте одну строку для ученика, которая могла бы кормить писателя 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файл

... оставлен как упражнение ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...