簡體   English   中英

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文件為空,因為它無法寫入該文件,因此為空。

為什么會這樣呢? 解決方法是什么? 我以前曾問過這個問題,但是有很多問題。 我在Mac 10.8 Mavericks iMac上運行Python 3.3.2,如果有幫助的話。

謝謝,德爾伯特。

第一個問題是您試圖將文本寫入以二進制模式打開的文件。 在3.x中,它將不再起作用。 “文本”與“二進制”之間的含義很少(僅影響行尾翻譯,因此在某些系統上完全沒有區別)。 現在,它的含義聽起來像是:以文本模式打開的文件是將其內容視為具有某種特定編碼的文本的文件,以二進制模式打開的文件是將其內容視為字節序列的文件。 。

因此,您需要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))

(另請注意新樣式的格式。)

如有必要,您可以使用encoding關鍵字參數在open調用中顯式指定文件的encoding (如果您不了解“編碼”的含義,則必須學習。我是認真的。刪除所有內容並查找它。)

書寫問題與open函數中的b有關。 您已以二進制模式打開它,因此只能寫入字節。 您可以刪除b或在output上調用bytes以為其提供正確的類型。 無論如何,您還是有邏輯錯誤。 當我在Python 2.7上運行它時,GuessedScores.txt的輸出是這樣的:

戴夫:雙端隊列([120,110,80,60],MAXLEN = 4)
傑克:deque([100,90,70,40],maxlen = 4)
Adam:deque([150,140,130,50],maxlen = 4)

因此,您的價值觀是整個雙端隊列,而不是個人分數。 您必須對它們進行格式化,類似於在打印語句中進行的格式化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM