按数值对CSV文件排序

时间:2019-06-13 12:04:26

标签: python csv sorting operator-keyword

因此,对于一项家庭作业,我必须编写一个程序以类似于排行榜的方式对分数进行排序,而且我不知道如何按降序对其进行排序。

如果有帮助,我将发送其余代码,我们将不胜感激。

忘记提及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 :(得分:0)

答案 1 :(得分:0)

这里的代码存在一些问题,我将尝试将其分解..我不建议您立即跳到熊猫。我将假定这实际上是在写数据..但是您应该检查“ 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的新排序版本,但实际上在csvReader上运行了for循环,自从您在上面进行设置以来,该循环没有改变。您还创建了csv_writer的{​​{1}},其中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)