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

标签 python dictionary text-files


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

现在,我想更进一步。下面是一个文本文件,其中包含我的参与者(戴夫、 jack 和亚当)的所有最近分数。

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'

例如,如果 adam 的分数为 200,我希望将 Scores_guessed 重写为:

Adam:200
Adam:150
Adam:140
Adam:130

出了什么问题?

更新 - 为了响应下面的第一个答案,我已将最后一个代码块编辑为:

for key, value in scores_guessed.items():
    writer.write("{}:{}\n".format(key,value))

但它给了我这样的信息: writer.write("{}:{}\n".format(key,value)) 类型错误:“str”不支持缓冲区接口(interface)

发生了什么?

最佳答案

您使用的writer.writerow语法对应于the csv module ,其使用方式如下:

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

由于您使用双端队列,请使用:

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]))))            

关于python - 重写我的分数文本文件以确保它只有最后 4 个分数 (python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28507196/

相关文章:

java - 可以设置 if 语句来搜索文本文件中的特定模式吗?

python - django tastypie 更新两个模型

python - 为什么我只能从 statsmodels OLS 拟合中获得一个参数

python - 使用条件循环遍历 JSON 对象

c - 为什么这个程序不能与 C 语言中的操作系统重定向命令一起使用?

c# - 使用C#从文件夹中获取所有文件名

python - 生成一个循环以达到特定结果

python - 通过 id、类名等以外的方式查找元素

java - 如何将两个长整数映射到一个整数(Java)

recursion - F# 迭代嵌套字典