如何正确地将元组列表写入 .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!
我正在尝试维护一个名称和时间列表,按时间递增排序。
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!