Python 使用csv的前5名分数

Python 使用csv的前5名分数,python,csv,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])) with

我很难从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]))  
    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']))
这是我目前得到的:

>>> leaderboards()
0 | Name | Score
1 | Ryan | 3
2 | Liam | 12
3 | Steve | 3
4 | Donald | 3
5 | Alan | 3
6 | Harry | 1
我想实现两个主要元素,但不知道如何实现。 他们将对分数进行排序,以使最高分数位于顶部,并将排行榜显示的玩家数量限制为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]))  
    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高。我不知道为什么,但也许你会意识到一些事情。再一次,非常感谢您,我很抱歉,我只是问了这么多,但就编码知识而言,这超出了我的能力范围如果你试图对每一行的最后一个元素排序,空白空间会引发一个错误。另外,我认为你的脚本也会考虑头行排序,所以如果你不打算考虑这一点,你应该跳过该行排序时。 如果要根据文件结构以所需方式打印分数,可以执行以下操作:

以open(“…文件名此处…”,“'r')作为数据:
reader=csv.reader(数据)
对于idx,枚举(读取器)中的行:
打印“{}}{}}{}”。格式(str(idx),第[0]行,第[2]行]

这将根据您为csv编制索引的方式逐行打印内容。由于您有一个标题行,我还建议您查看Python csv模块中的
DictReader
。这样你就不必在将来依赖于指数头寸

此外,如果您在csv中有额外行的问题,请查看

根据评论中的请求更新排序:

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列中的相应键使用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']))

您好,您正在尝试从每一行访问值[-1],但由于您的csv文件有空行,因此会引发错误。我已编辑了我的问题,如果您能查看,我将不胜感激。谢谢!:)@我为你更新了答案。这应该是你想要的。很抱歉再次询问,但我如何在代码中实现这一点?正如我目前所做的那样,它输出的结果是:[[Name]、[Password]、[Score]、[Ryan]、[pass]、[3']、[Steve]、[pass]、[3']、[Donald]、[Adadaddad]、[3']、[Alan]、[Adadaddad]、[3']]这并不理想,因为首先分数都被设置为相同的,并且已经失去了格式。非常感谢您迄今为止的帮助。@Arctic我在上面为您添加了几个选项。我已经尝试了您提供的两个选项,但是我已经在编辑中介绍了这个问题。