我正在尝试建立一个计分系统,在这个系统中,我需要将文本文件中的所有分数输入一个“记录数组”。你知道吗
我对Python
相当陌生,希望有一个简单的解决方案。你知道吗
在我的程序中,从技术上讲,记录数组将分类为namedtuples
列表。你知道吗
目前我有:
Player = namedtuple("Player", ["name", "result", "difficulty", "score"])
Playerlist = []
while str(f.readline) != '':
player = Player(
f.readline(),
f.readline(),
f.readline(),
f.readline())
Playerlist.append(player)
我试着print(Playerlist[0])
,但什么也没出现。你知道吗
我也尝试过print(Playerlist[0])
不使用任何循环,并得到了预期的结果,尽管我不会将文本文件中的所有数据都存储到我的程序中。你知道吗
文本文件(scores.txt
)中的内容示例:
George
lost
H
18
Holly
lost
H
28
Marcus
won
H
30
编辑: 我试过:
with open("scores.txt", "r") as f:
for line in f:
player = Player(
f.readline(),
f.readline(),
f.readline(),
f.readline())
Playerlist.append(player)
但是所有的内容都混在一起了:
Player(name='H\n', result='28\n', difficulty='Marcus\n', score='won\n')
这个代码和这个方法都有几个问题。有许多文件格式对这类事情很有用;一种非常流行的具有内置Python支持的格式是JSON。你知道吗
namedtuple
不是我经常看到的东西。将它与JSON一起使用可能有点不可靠,虽然有workarounds,但最好使用带有简单自定义序列化程序的Player
类,将由namedtuple
生成的类作为子类,该类定义返回JSON或JSON formattable dict的方法(非常复杂),或者编写一个单独的函数,将namedtuple
对象显式转换为JSON。你知道吗关于阅读现有格式:
chunks
函数来自this answer。这取决于你知道每个玩家要解包的值的数量,对于这种格式是不能改变的。你知道吗在这里读取
lines
时,使用list comprehension从每个值的末尾剥离换行符。你知道吗最后,用} 发送。因此,有效地,方法调用变成了
player_values
实例化Player
元组,这是一个由chunks
生成并使用*
展开的列表。这意味着,不是将列表player_values
传递给函数Player.__init__(...)
,而是将单个值作为^{Player(name, result, difficulty, score)
,而不是Player([name, result, difficulty, score])
。你知道吗虽然这从技术上来说是检索值的,但是请注意这里分配的
score
是一个字符串,而不是一个数值。例如,如果希望将其转换为int
,则需要写出完整的实例化:因为您使用的是
while str(f.readline) != '':
,所以它读取第一行。所以,第一行(以及扩展记录之间的所有行)必须有空行。另外,你的while
中的readline
缺少副命题()
。除此之外,代码是在python3中工作的。您可以使用with
打开文件:它会自动关闭文件并为您处理详细信息。但是,使用json或其他格式是更好的选择。你知道吗
相关问题 更多 >
编程相关推荐