2

我有一个非常大的文本文件,其中包含曲棍球统计数据。

每行我需要两件事:

  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 

- 重复更多的球员和统计数据(没有换行符)

我需要获取玩家名称,在这种情况下,“html_log”标签后面的文本我还需要第一组数字,并且需要输出以返回前 10 名列表。

最佳结果将输出

->>

Bob 1217.1
Jim 1153.3
Steve 485.5

+ 文本文件中的其余用户及其评分,从高到低。或者只是文本文件中的前 10 名。

4

3 回答 3

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))

现在你有一个listof name,score对,很容易打印出来:

for name, score in top_10_pairs:
    print('{} {}'.format(name, score))

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

于 2013-05-28T08:32:47.713 回答
2
dict(line.split()[:2] for line in
    [line.split(":")[1] for line in data.split("\n")])
#  {'Bob': '1217.1', 'Jim': '1153.3', 'Steve': '485.5'}
于 2013-05-28T08:29:13.107 回答
-3

以下代码完全符合您的要求:

filin = open('文件','r')

d = {}

for i in filin:

    startName = i.find('html_log:') + len('html_log:')

    endName = i.find(' ',startName)

    name = i[startName:endName]

    startPoint = endName + 1

    endPoint = i.find(' ',startPoint)

    points = i[startPoint:endPoint]

    d[points] = name

d.keys().sort()

counter = 0  ##to make sure that we print only the top 10

filin.close()

for key in d.keys():


    print d[key],' ',key

    counter += 1

    if counter == 10:

        break
于 2013-05-28T08:35:53.967 回答