Python 将字典覆盖到文本文件不起作用...为什么?

Python Overwrite Dictionary to Text File doesn't work... why?


我之前一直在为一个带有存储所有参与者结果的文本文件的测验程序编写代码。将文本文件转换为字典的代码和文本文件本身如下所示:

代码:

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文件是空的,因为它不能写入文件,因为有上面的错误。

为什么会这样?解决办法是什么?我以前问过这个问题,但有很多问题。我正在 运行ning Python 3.3.2 Mac 10.8 Mavericks iMac,如果有帮助的话。

谢谢, 德尔伯特.

第一个问题是您试图将文本写入以二进制模式打开的文件。在 3.x 中,这将不再有效。 "text" 与 "binary" 过去意义不大(仅影响行尾翻译,因此在某些系统上根本没有区别)。现在它的意思就像听起来的那样:以文本模式打开的文件的内容将被视为具有某种特定编码的文本,而以二进制模式打开的文件的内容将被视为字节序列.

因此,您需要 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 关键字参数明确指定文件的编码。 (如果你不知道我说的"encoding"是什么意思,你一定要学习一下,我是认真的,放下一切看看起来。)

书写问题与open函数中的b有关。您已经以二进制模式打开它,因此只能写入字节。您可以删除 b 或在 output 上调用 bytes 以赋予它正确的类型。无论如何,你有一个逻辑错误。当我在 Python 2.7 上 运行 时,GuessedScores.txt 的输出是这样的:

Dave:deque([120,110,80,60],maxlen=4)
Jack:deque([100, 90, 70, 40], maxlen=4)
Adam:deque([150, 140, 130, 50], maxlen=4)

所以你的价值观是整个deques,而不是个人分数。您必须对它们进行格式化,类似于您在 print 语句中所做的。