解析文件以获得前10名玩家.

use*_*027 2 python parsing list

我有一个非常大的文本文件,其中包含曲棍球统计信息.

我需要每行两件事:

  1. 玩家的名字
  2. 要点.(第一组数字)

我想回到前10名.

下面是文本文件的示例,但它会持续更长时间.

html_log:Bob 1217.1 1.75 696:48 1 5 38 6 109 61 14:42 633 223 25 435:36 182 34 0.55    
html_log:Steve 485.5 1.26 385:18 7 12 -1 28 172 218 16:04 839 94 101 143:18 44 15 -0.03
html_log:Jim 1153.3 1.84 625:54 1 2 71 3 2 10 7:58 499 3 5 616:36 241 36 1.13 
Run Code Online (Sandbox Code Playgroud)

-repeats拥有更多玩家和统计数据(无换行符)

我需要获取播放器名称,在这种情况下,"html_log"标签后面的文本我还需要第一组数字,并且需要输出以返回前10个列表.

最佳结果将输出

- >>

Bob 1217.1
Jim 1153.3
Steve 485.5
Run Code Online (Sandbox Code Playgroud)

+文本文件中的其他用户及其评级,从最高到最低.或者只是文本文件中排名前10位的文件.

aba*_*ert 6

把它分成小块,每一块都很容易.

在英语中:对于文件中的每一行,您需要前两个值,并且希望在冒号后分割第一个值,并且您希望将第二个值视为数字.然后,您想要跟踪前10对,按第二个值排序.

在Python中:

with open('large_file.txt') as f:
    pairs = (line.split()[:2] for line in f)
    processed_pairs = ((pair[0].split(':')[1], float(pair[1])) for pair in pairs)
    top_10_pairs = heapq.nlargest(10, processed_pairs, key=operator.itemgetter(1))
Run Code Online (Sandbox Code Playgroud)

现在,您已经有了一个listname,score对,这是很容易打印出来:

for name, score in top_10_pairs:
    print('{} {}'.format(name, score))
Run Code Online (Sandbox Code Playgroud)

无论文件有多大,一次都不会在内存中保留10个以上的处理对(加上读缓冲区和其他一些基本内容),因为我们只是转换了一个充满文件的迭代器(一个文件)一步一步地进入其他迭代器,并将其输入heapq.nlargest,只保持顶部n.