Я делаю программу в школе, где пользователи опрашиваются по определенным темам, а их результаты сохраняются в CSV-файл. Мне удалось распечатать строку с самым высоким счетом, но это не выглядит очень аккуратно.

with open ('reportForFergusTwo.csv', 'r') as highScore:
            highScoreFinder=highScore
            valid3=False
            for row in highScoreFinder:
                if subjectInput in row:
                    if difficultyInput in row:
                        if ('10' or '9' or '8' or '7' or '6' or '5' or '4' or '3' or '2' or '1') in row:
                            valid3=True
                            print("The highest score for this quiz is:",row)

Например: «Самый высокий балл для этого теста: химия, легкий, 10, Luc16», но я бы предпочел сказать что-то вроде «Самый высокий балл для этого теста: 10» и «Этот балл был достигнут : Luc16 ", вместо того, чтобы просто распечатать всю строку, с ненужными деталями, такими как то, что было на викторине.

Мой CSV-файл выглядит так:

Subject,Difficulty,Score,Username
language,easy,10,Luc16
chemistry,easy,10,Luc16
maths,easy,9,Luc16
chemistry,easy,5,Eri15
chemistry,easy,6,Waf1
chemistry,easy,0,Eri15

Я подумал, что, возможно, если бы я мог найти способ взять отдельные результаты (счет и имя пользователя) и поместить их в свои собственные индивидуальные переменные, тогда было бы намного проще представить их так, как я хочу, и иметь возможность ссылаться на них позже в функции, если мне нужно, чтобы они отображались снова.

Я просто новичок в кодировании и мне любопытно, можно ли это сделать, чтобы я мог улучшить внешний вид своего кода.

Изменить: Чтобы решить эту проблему, я использовал str.split (), чтобы разбить отдельные поля в строках моего CSV, чтобы они могли быть выбраны и удерживаться переменной. Принятый ответ показывает решение, которое я использовал, но это мой окончательный код на случай, если неясно

with open ('details.csv', 'r') as stalking:
        stalkingReader=csv.reader(stalking)
        valid4=False
        for column in stalkingReader:
            if user in column[3]:
                valid4=True
                print("Here are the details for user {}... ".format(user))
                splitter=row.split(',')
                name=splitter[0]
                age=splitter[1]
                year=splitter[2]
                print("Name: {}".format(name))
                print("Age: {}".format(age))
                print("Year Group: {}".format(year))
                postReport()
    if valid4==False:
        print("Sorry Fergus, this user doesn't seem to be in our records.")
0
user9420932 28 Фев 2018 в 22:07

4 ответа

Лучший ответ

Вы можете использовать str.split(), чтобы разбить строки вашего CSV, чтобы вы могли отдельно ссылаться на поля:

split_row = row.split(',')
score = split_row[2]
user = split_row[3]
print("The highest score for this quiz is: " + score)
print("This score was achieved by: " + user)
0
DBedrenko 28 Фев 2018 в 19:17
with open("reportForFergusTwo.csv", "r") as highScore:

    subject = []
    difficulty = []
    score = []
    name = []
    for line in highScore:
        subject.append(line.split(',')[0])
        difficulty.append(line.split(',')[1])
        score.append(line.split(',')[2])
        name.append(line.split(',')[3])

    ind = score.index(max(score)

    print("The highest score for this quiz is: ", max(score))
    print("This was achieved by ", name[ind])

with открывает (и закрывает) файл .csv. Затем создаются четыре пустых списка. Затем я перебираю каждую строку в файле и разбиваю каждую строку, используя запятую в качестве разделителя. Это создает список из четырех элементов, которые добавляются в каждый список.

1
Adi219 28 Фев 2018 в 21:49

Вы можете использовать библиотеку CSV

import csv                                                                      

with open("data", "r") as f:                                                                         
    reader = csv.reader(f)                                                         
    # skip header                                                                  
    reader.next()                                                                  
    # organize data in 2D array                                                    
    data = [ [ sub, dif, int(score), name ] for sub, dif, score, name in reader ]
    # sort by score                                                                
    data.sort(key=lambda x: x[2], reverse=True)                                    
    # pretty print                                                                 
    print "The highest score for this quiz is:", data[0][2]                        
    print "This score was achieved by:", data[0][3]  
0
Kicaj 28 Фев 2018 в 20:47

(Размещено решение от имени ОП) .

Чтобы решить эту проблему, я использовал str.split (), чтобы разбить отдельные поля в строках моего CSV, чтобы их можно было выбирать и удерживать с помощью переменной. Принятый ответ показывает решение, которое я использовал, но это мой окончательный код на случай, если неясно

with open ('details.csv', 'r') as stalking:
        stalkingReader=csv.reader(stalking)
        valid4=False
        for column in stalkingReader:
            if user in column[3]:
                valid4=True
                print("Here are the details for user {}... ".format(user))
                splitter=row.split(',')
                name=splitter[0]
                age=splitter[1]
                year=splitter[2]
                print("Name: {}".format(name))
                print("Age: {}".format(age))
                print("Year Group: {}".format(year))
                postReport()
    if valid4==False:
        print("Sorry Fergus, this user doesn't seem to be in our records.")
0
halfer 1 Мар 2018 в 23:15