Сортировать файл CSV по числовым значениям - PullRequest
1 голос
/ 13 июня 2019

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

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

Забыл упомянуть, что файл CSV выглядит так: ИМЯ, СЧЕТ

Я видел здесь много вопросов по этому поводу, и ни один из них, похоже, не работает с моими.

with open('names.csv', 'a', newline='') as names:
    csvWriter = csv.writer(names)
    csvWriter.writerow([name, int(score)])

with open('names.csv', 'r') as names:
    csvReader = csv.reader(names)
    csv1 = csv.reader(names, delimiter='.')
    sort = sorted(csv1, key=operator.itemgetter(0))
    csv_writer = csv.writer(names, delimiter='.')
    for name in csvReader:
        print(' '.join(name))

нет сообщений об ошибках или результатов, просто код выхода

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Здесь есть несколько проблем с вашим кодом, я постараюсь разбить его .. Я пока не рекомендую переходить к пандам.Я собираюсь предположить, что это на самом деле запись данных ... но вы должны проверить "names.csv", чтобы убедиться, что он не пустой.Похоже, это будет писать только одну строку.Я также не уверен, почему вы установили newline='', я, вероятно, не сделал бы этого здесь ... хотя я не уверен, что это будет иметь значение csv.writer.

with open('names.csv', 'a', newline='') as names:
    csvWriter = csv.writer(names)
    csvWriter.writerow([name, int(score)])

обычно у вас будетцикл внутри утверждения, подобного следующему:

my_list = [("Bob", "2"), ("Alice", "1")]

with open('names.csv', 'a') as names:
    csvWriter = csv.writer(names)
    for name, score in my_list:
        csvWriter.writerow([name, int(score)])

Вы делаете двух читателей CSV здесь .. Я не уверен, почему.Второй использует "."так как это разделитель ... вы не указали разделитель при написании CSV, поэтому он будет иметь стандартный разделитель с запятой ",".csvReader будет использовать это по умолчанию, но csv1 будет пытаться разбить на периоды и не будет делать это хорошо.

with open('names.csv', 'r') as names:
    csvReader = csv.reader(names)
    csv1 = csv.reader(names, delimiter='.')

Вы не должны использовать "sort" в качестве имени переменной ... этоназвание общего метода.Но это на самом деле ничего не сломает ... вы создаете новую отсортированную версию csv1, но вы фактически запускаете цикл for на csvReader, который не изменился с момента установки выше.Вы также создаете csv_writer с names с открытым для чтения, а не для записи.но вы все равно не используете его.itemgetter смотрит на индекс 0, который будет именами вашего писателя .. если вы хотите отсортировать по баллу, используйте 1.

    sort = sorted(csv1, key=operator.itemgetter(0))
    csv_writer = csv.writer(names, delimiter='.')
    for name in csvReader:
        print(' '.join(name))

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

#!/usr/bin/env python3
import csv
import operator

my_list = [("Bob", "2"), ("Alice", "1")]

with open('names.csv', 'a') as names:
    csvWriter = csv.writer(names)
    for name, score in my_list:
        csvWriter.writerow([name, int(score)])

with open('names.csv', 'r') as names:
    csvReader = csv.reader(names)
    sorted_reader = sorted(csvReader, key=operator.itemgetter(1))
    for name, score in sorted_reader:
         print(name, score)

Вывод:

Alice 1
Bob 2

Поскольку вы хотите, чтобы он выглядел "как таблица лидеров", вы, вероятно, хотите другой вид.. Вы хотите изменить его и фактически использовать целочисленные значения столбца оценки (например, чтобы 100 отображалось выше 2).

    sorted_reader = sorted(csvReader, key=lambda row: int(row[1]), reverse=True)
0 голосов
/ 13 июня 2019
...