我以前一直在为测验程序编写代码,其中包含一个存储所有参与者结果的文本文件。将文本文件转换为字典的代码和文本文件本身如下所示:
代码:
import collections
from collections import defaultdict
scores_guessed = collections.defaultdict(lambda: collections.deque(maxlen=4))
with open('GuessScores.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('GuessScores.txt', 'wb')
for key, value in scores_guessed.items():
output = "%s:%s\n" % (key,value)
writer.write(output)
文本文件如下所示:
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
现在,当我运行程序代码时,字典显示如下:
Adam 150 140 130 50
Dave 120 110 80 60
Jack 100 90 70 40
现在,这将字典排列为最高分数和前4个分数!
我希望python IDLE将GuessScores.txt覆盖为:
Adam:150
Adam:140
Adam:130
Adam:50
Dave:120
Dave:110
Dave:80
Dave:60
Jack:100
Jack:90
Jack:70
Jack:40
但是当我运行代码时,会出现此错误:
Traceback (most recent call last):
File "/Users/Ahmad/Desktop/Test Files SO copy/readFile_prompt.py", line 16, in <module>
writer.write(output)
TypeError: 'str' does not support the buffer interface
GuessScores.txt文件为空,因为它无法写入文件,因为上面有错误。
为什么会这样?什么是修复?我以前问过这个,但是有很多问题。我在Mac 10.8 Mavericks iMac上运行Python 3.3.2,如果有任何帮助的话。
谢谢, 德尔伯特。
答案 0 :(得分:1)
第一个问题是您正在尝试将文本写入以二进制模式打开的文件。在3.x中,这将不再有效。 &#34;文本&#34; vs.&#34; binary&#34;过去意味着很少(只影响行结束翻译,所以在某些系统上没有任何区别)。现在它意味着它听起来像:在文本模式下打开的文件是其内容将被视为具有某种特定编码的文本的文件,以二进制模式打开的文件是其内容将被视为字节序列的文件。
因此,您需要open('GuessScores.txt', 'w')
,而不是open('GuessScores.txt', 'wb')
。
也就是说,您确实应该使用with
块来管理文件,并且您将不得不编写实际以您希望的方式格式化字典内容的代码。我假设您打算按排序的名称顺序输出,并且您需要迭代每个双端队列并为每个项目写一行。类似的东西:
with open('GuessScores.txt', 'w') as f:
for name, scores in sorted(scores_guessed.items()):
for score in scores:
f.write("{}:{}\n".format(name, score))
(另请注意新式格式。)
如有必要,您可以使用open
关键字参数在encoding
调用中明确指定文件的编码。 (如果你不知道我的意思&#34;编码&#34;,你 必须 学习。我是认真的。放弃一切查一查。)
答案 1 :(得分:0)
写作问题与b
函数中的open
有关。您已经以二进制模式打开它,因此只能写入字节。您可以删除b
或致电bytes
上的output
以获得正确的类型。不过你有一个逻辑错误。当我在Python 2.7上运行它时,GuessedScores.txt的输出是这样的:
戴夫:双端队列([120,110,80,60],MAXLEN = 4)
Jack:deque([100,90,70,40],maxlen = 4)
Adam:deque([150,140,130,50],maxlen = 4)
所以你的价值观是整个deques,而不是个人得分。您必须对它们进行格式化,类似于您在打印语句中的操作方式。