使用CSV的前5个成绩

时间:2018-09-17 15:39:36

标签: python csv

我很难显示csv文件中的前5个得分。 这是我当前的代码:

def leaderboards():
    with open('userData.csv', 'r') as data:
        reader = csv.reader(data)
        for idx, row in enumerate(reader):
            print('{} | {} | {}'.format(str(idx), row[0], row[2]))  

这是我目前得到的:

>>> leaderboards()
0 | Name | Score
1 | Ryan | 3
2 | Liam | 12
3 | Steve | 3
4 | Donald | 3
5 | Alan | 3
6 | Harry | 1

我要实现两个主要元素,但不知道如何实现。 他们将对分数进行排序,以使最高分数排在首位,并将排行榜显示的玩家人数限制为5。

当前代码:

    with open('userData.csv', 'r') as data:
                reader = csv.DictReader(data)
                newList = sorted(reader, key=lambda row: row['Score'],
reverse=False)[0:5]
                print ('  | Name | Score')
                for i, r in enumerate(newList):
                    print('{} | {} | {}'.format(str(i), r['Name'], r['Score']))

当前结果:

  | Name | Score
0 | Liam | 12
1 | Harry | 2
2 | Ryan | 3
3 | Steve | 3
4 | Donald | 3

它在大多数情况下都起作用,但是2比3高。我不确定为什么,但是也许您可能会意识到。再次非常感谢,很抱歉我问的太多了,但是就编码知识而言,这超出了我的能力。 :D

1 个答案:

答案 0 :(得分:1)

如果您尝试对每行的最后一个元素进行排序,则空格会引发错误。此外,我认为您的脚本还将考虑标题行进行排序,因此,如果您不想考虑该行,则应在排序时跳过该行。

如果您要根据文件结构以自己想要的方式打印分数,可以执行以下操作:

with open('...file name here...', 'r') as data: reader = csv.reader(data) for idx, row in enumerate(reader): print '{} | {} | {}'.format(str(idx), row[0], row[2])

这将根据您为csv编制索引的方式逐行打印内容。由于您有标题行,因此我也建议您查看Python csv模块中的DictReader。这样一来,您将来就不必依赖索引位置了。

此外,如果您在csv中遇到多余的行,请查看this answer

根据注释中的请求进行更新以进行排序:

要对reader进行排序,您可以仅基于csv列中的相应键使用lambda。假设“分数”是您要排序的列,并且“分数”是索引2,则可以执行以下操作:

newList = sorted(reader, key=lambda row: row[2], reverse=True)

这将为您提供按第二个索引降序排列的列表。删除reverse=True以获取升序排列。

然后,如果您只想获取前五个条目,则可以对列表进行切片:

slicedList = newList[0:5]

然后,您可以照常打印出列表。

更新2以适应第二个请求:

with open('...name of your file...', 'r') as data:
    reader = csv.reader(data)
    newList = sorted(reader, key=lambda row: row[2], reverse=True)[0:5]
    for i, r in enumerate(newList):
        print('{} | {} | {}'.format(str(i), r[0], r[2]))

上面的代码假设(从您的原始csv文件中)r [0]是“名称”列,r [2]是“得分”列。

此外,作为替代方案,您可以使用csv.DictReader,以防列标题更改索引。替代代码如下:

with open('...your file name here...', 'r') as data:
    reader = csv.DictReader(data)
    #### COMMENTING THIS OUT in favor of the newList below
    # newList = sorted(reader, key=lambda row: row['Score'], reverse=True)[0:5]
    ##### EDIT to evaluate the Score as an int()
    # cast row['Score'] to an int() below so that sorted() treats the row like and int rather than str
    newList = sorted(reader, key=lambda row: int(row['Score']), reverse=True)[0:5]
    print ('  | Name | Score')
    for i, r in enumerate(newList):
        print('{} | {} | {}'.format(str(i), r['Name'], r['Score']))