如何正确地将元组列表写入 .txt 文件?

How do I correctly write a tuple list to a .txt file?

我正在尝试维护一个名称和时间列表,按时间递增排序。

def listfile (name, time):

    players = []
    strtime = str(time)
    players.append((name, strtime))
    with open("playersScores.txt", "r") as f:
        for line in f:
            if line != '\n':
                name, strtime = line.split(',')
                players.append((name, strtime))
    f.close()  

    players.sort(key=lambda tup: tup[1])

    with open("playersScores.txt", "w") as f:
        for (name, strtime) in players:
            f.write("%s\n" % (name + "," + strtime))
    f.close() 

这基本上是有效的,但它在每一行下面都留下了一个空行,除了新添加的行。

我想要这样的东西:

Bob,32.82
Bill,34.22
Joe,39.09
Bob,45.23
George,46.08

但我得到:

Bob,32.82

Bill,34.22
Joe,39.09

Bob,45.23

George,46.08

Bill,34.22 是最后一个条目。

问题是在读取文件时,每行末尾的 \n 不会自动被剥离。在此处显示的代码中,变量 strtime 末尾仍包含一个 \n 字符。

name, strtime = line.split(',')
players.append((name, strtime))

调用 f.write() 中的 \n 没问题。你只需要在阅读时去掉 \n 即可。 rstrip() 将删除字符串右侧的空白字符。

这样做:

name, strtime = line.split(',')
players.append((name, strtime.rstrip()))

由于您创建的是技术上的 .csv 文件,您还可以查看 csv 模块

import csv
import itertools

with open('path/to/file.txt', 'r+') as f:
    reader = csv.reader(f)
    new_lines = sorted(itertools.chain(reader, (name, strtime)),
                       key=lambda x: float(x[1]))
    f.seek(0)  # rewind to the beginning of the file
    writer = csv.writer(f, lineterminator="\n")
    # you must specify the lineterminator on Windows, or else open in binary mode
    # however csv.readers don't work in binary mode on Windows.
    writer.writerows(new_lines)

请注意,如果您要删除行,这会给您带来一些奇怪的错误。这不会在写入文件之前截断文件——您正在覆盖数据,因此替换

1
3
5
7

2
4
8

会给你

2
4
8
7  # oops!