2

我得到了一个 .txt 文件,其中充满了这种结构的很多行。

["saelyth", 17896, 96511, 4733, "0", "F00", "0", 11, 1, "ffg, ghks"]
["example", 765, 3873, 342, "000", "F63", "5", 15, 1, "ffg"]
["whatever", 158, 756, 36, "000", "000", "0", 13, 0, "ffg, jdhs"]
["okay", 12680, 64548, 4469, "000", "0CC", "1", 15, 9, "ffg"]
["randomname", 5668, 30105, 1752, "0", "360", "0", 14, 7, "ffg"]
["something", 24798, 132792, 5764, "000", "000", "0", 12, 3, "ffg"]

到目前为止,我一直在使用 json.loads 逐行加载。但是现在我想使用 value[3] 作为键来排在列表的前 10 位(按升序排列)。

我该怎么做?我在谷歌上搜索 sorted 的工作原理,但我认为我不能在不破坏列表并仅提取该值的情况下使用它,然后我无法在 Top10 打印中显示正确的列表:\

我尝试将其转换为元组,但它不保存文件,也不知道为什么。

    leyendotop10 = open("textfiles\estadisticas\Estadisticas.txt", "r")
    top10leido = leyendotop10.read()
    leyendotop10.close()

    print("Readed")
    atuple1 = top10leido.replace("[", "(")
    atuple2 = atuple1.replace("]\n", "), ")
    listitaglobaldetop10 = []
    listitaglobaldetop10.append(atuple2)
    print("Fixed")
    sorted(listitaglobaldetop10, key=lambda stats: stats[1])
    print("Ordered")

    grabandotop10 = open("textfiles\estadisticas\top10.txt", "a")
    grabandotop10.write(str(listitaglobaldetop10))
    grabandotop10.close()
    print("Saved")

有什么想法或更简单的方法来做我想做的事情吗?

信息: IDLE 3.3.2 和文本文件包含 4300 个列表。

4

3 回答 3

4
# reading the file
with open(filename, 'r') as infile:
    lines = list(json.loads(x) for x in infile)

# the important part
top_10_lines = sorted(lines, key = lambda line : line[3], reverse = True)[0:10]

# to write the top 10 file:
with open(other_filename, 'w') as outfile:
    for line in top_10_lines:
        print(json.dumps(line), file = outfile)

如果你愿意,你可以花哨并使用heapq.nlargest而不是sorted获得前 10 名。

您也可以省略列表(有或没有'nlargest'),但前提是您的代码不需要lines用于其他任何事情:

# reading the file
with open(filename, 'r') as infile:
    top_10_lines = heapq.nlargest(
        10,
        (json.loads(x) for x in infile),
        key = lambda x : x[3],
    )

这应该使用更少的内存,并且可能会更快。由于您的文件很小,只有几百 KB,这可能没什么大不了的。对于只需要少量行的大文件,它会产生明显的差异。

于 2013-10-19T23:52:40.597 回答
3

我认为您可以简化一下。假设您的文本文件如图所示。您可以按如下方式逐行阅读:

from ast import literal_eval
lines = []
with open(infile_path, 'r') as infile:
    for line in infile:
        line = literal_eval(line)
        lines.append(line)

现在您已经获得了lines文件中行的列表(称为 ),并且由于它们的结构,它们已经可以解释为 Python 类型(该literal_eval位解释文本)。

现在按您可以执行的条目之一对它们进行排序(这里我按索引 3 条目排序):

lines.sort(key = lambda x: x[3])

在这里,我使用lambda 表达式来返回每个项目中的索引 3 条目。有关详细信息,请参阅排序方法。

完成后,您可以选择前 10 个并将它们写入您的文件:

with open(outfile_path, 'w') as outfile:
    for line in lines[-10:]:
        print(line, file=outfile)
于 2013-10-19T23:35:01.337 回答
0

这应该做你想要的。您需要将数据写入新文件。

def item_one(sequence):
    """Returns int(sequence[1]).
    """
    return int(sequence[1])

data = []
with open('file.txt') as f:
    for line in f:
        # strip the line terminator and brackets
        line = line.strip().strip('[]')
        # make it into a list
        line = line.split(',')
        #save it for later
        data.append(line)

data.sort(key = item_one)
print data[-2:]

# or
data.sort(key = item_one, reverse = True)
print data[:2]
于 2013-10-19T23:49:29.240 回答