重写我的分数文本文件以确保它只包含最后4个分数(python)

重写我的分数文本文件以确保它只包含最后4个分数(python),python,dictionary,text-files,Python,Dictionary,Text Files,以前,在SO用户的帮助下,我已经能够找到如何在字典中使用maxlength属性在Python文档中最多存储4个键 现在,我想更进一步。下面是一个文本文件,其中包含了我的参与者Dave、Jack和Adam最近的所有分数 Jack:10 Dave:20 Adam:30 Jack:40 Adam:50 Dave:60 Jack:70 Dave:80 Jack:90 Jack:100 Dave:110 Dave:120 Adam:130 Adam:140 Adam:150 现在,下面是我的代码,让我可


以前,在SO用户的帮助下,我已经能够找到如何在字典中使用maxlength属性在Python文档中最多存储4个键

现在,我想更进一步。下面是一个文本文件,其中包含了我的参与者Dave、Jack和Adam最近的所有分数

Jack:10
Dave:20
Adam:30
Jack:40
Adam:50
Dave:60
Jack:70
Dave:80
Jack:90
Jack:100
Dave:110
Dave:120
Adam:130
Adam:140
Adam:150
现在,下面是我的代码,让我可以看到Python中的最后4个分数:

import collections
from collections import defaultdict
scores_guessed = collections.defaultdict(lambda: collections.deque(maxlen=4))
with open('Guess Scores.txt') as f:
    for line in f:
    name,val = line.split(":")
    scores_guessed[name].appendleft(int(val))

for k in sorted(scores_guessed):
    print("\n"+k," ".join(map(str,scores_guessed[k])))

writer = open('Guess Scores.txt', 'wb')

for key, value in scores_guessed.items():
   writer.writerow([key,':',value])
显然,它将为字典打印以下结果:

Adam 150 140 130 50

Dave 120 110 80 60

Jack 100 90 70 40
但是,我希望文件按字母顺序读取最后四个结果:

Adam:150
Adam:140
Adam:130
Adam:50
Dave:120
Dave:110
Dave:80
Dave:60
Jack:100
Jack:90
Jack:70
Jack:40
我认为这段代码可以工作:

for key, value in scores_guessed.items():
   writer.writerow([key,':',value])
但这给了我一个结果:

AttributeError: '_io.BufferedWriter' object has no attribute 'writerow'
例如,如果亚当得了200分,我想把你猜的分数改写为:

Adam:200
Adam:150
Adam:140
Adam:130
出什么事了

更新-针对下面的第一个答案,我编辑了最后一个代码块:

for key, value in scores_guessed.items():
    writer.write("{}:{}\n".format(key,value))
但它给了我这样一个信息: write(“{}:{}\n”.format(键,值)) TypeError:“str”不支持缓冲区接口


发生了什么事?

您使用的
writer.writerow
语法对应于以下语法:

import csv
with open('some_file.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
    writer.writerow(['Spam'] * 5 + ['Baked Beans'])
    writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
在我看来,您使用了一些错误的引用来执行此操作,因为您没有在上面的代码中使用
csv
模块

所以,修改下面的代码

for key, value in scores_guessed.items():
   writer.writerow([key,':',value])
根据本守则:

for key, value in scores_guessed.items():       
    output = "%s:%s\n" % (key,value)
    writer.write(output)
编辑

您正在以二进制模式打开文件,而不是使用

writer = open('Guess Scores.txt', 'wt')
for key, value in scores_guessed.items():       
    output = "{}:{}\n".format(key,value)
    writer.write(output)
writer.close()
编辑2

由于使用deque,请使用:

writer = open('Guess Scores.txt', 'wt')
for key, value in scores_guessed.items():       
    output = "{}:{}\n".format(key,','.join(map(str, scores_guessed[key])))
    writer.write(output)
writer.close()
或使用:

with open("output.txt", "wt") as f:
    for key in scores_guessed:
        f.write("{} {}".format(key, ','.join(map(str, scores_guessed[key]))))            

而不是
writer.writerow(…)
do
writer.write({}:{}\n'.format(key,value))
。另外,我会将该变量的名称更改为类似于
outfile
的名称,因为将其命名为
writer
会让人困惑。另一个错误
TypeError:不支持%的操作数类型:'字节'和'元组'
@DelbertJ.Nava您使用的是哪种版本的python?稍后我将单独提问,因为注释可能不适用于可能对类似于我的解决方案感兴趣的其他用户。@DelbertJ.Nava检查编辑。。。这些工作在我的系统上。。。我花了一段时间浏览文档。不幸的是,它不起作用-仍然给我第一个收到的类型错误。如果您可以将所有代码发布到gitHub或类似的代码服务上,因为它根本不在我的计算机上,这是否可能。字典打印得很完美,但随后抛出错误,并将.txt文件保留为空,因为由于错误本身保留了空闲文件,因此无法写入任何内容。