2012-11-12 69 views
0

這裏有很多關於輸出字典內容的帖子。實際上,我發現了一個非最佳解決方案(我將在下面展示),但我最感興趣的是爲什麼我的非最佳解決方案起作用。輸出Python字典的內容

這裏是我的代碼:

只是
import csv 

keys = ("Ev", "E1", "E2", "E3", "I", "B", "O", "T") 
p = input("P") 
e = input("e") 
e2 = input("e2") 
e3 = input("e3") 
it = input("it") 
b = input("b") 
o = input("o") 
t = input("t") 

dictionary = {"Ev": p, "E1": e, "E2": e2, "E3": e3, "I": it, "B":b, "O": o, "T": t} 
dictionary2 = {"Ev": p, "E1": e, "E2": e2, "E3": e3, "I": it, "B":b, "O": o, "T": t} 

with open("infile.csv", "a") as f: 
    w = csv.DictWriter(f, keys) 
    w.writeheader() 
    for answer in (dictionary, dictionary2): 
     w.writerow(answer) 

我的目標是一個字典。但是,當我嘗試輸出字典的內容時,我一直得到關於「B」的ValueError。我嘗試了一些解決方案,最好的一個似乎是添加第二個字典,它只打印兩次相同的確切輸出,當我打開它時,我可以從輸出文件中刪除精確的重複項。我知道這是非常糟糕的做法,但這是我得到的最快捷的解決方案,在這一段時間內陷入困境是一件壞事。

爲什麼添加第二個字典在這種情況下工作?我不明白爲什麼這個代碼拋出一個ValueError,如果只有一個字典被使用,但是當兩個工作正常時(除了重複的行,我必須刪除)。

編輯

非工作代碼是行:

for answer in (dictionary): 

,正如馬亭好心指出的那樣,只是循環在一個字典的鍵。

EDIT2

而且,追蹤誤差爲:

Traceback (most recent call last): 
    File "file.py", line 41, in <module> 
    w.writerow(answer) 
    File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/csv.py", line 153, in writerow 
    return self.writer.writerow(self._dict_to_list(rowdict)) 
    File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/csv.py", line 149, in _dict_to_list 
    + ", ".join(wrong_fields)) 
ValueError: dict contains fields not in fieldnames: B 
+0

python version? –

+2

請給出完整的追溯和*非工作*代碼,以便我們能夠爲您提供幫助;你可能設法意外地創建了工作代碼,而不是因爲你偶然發現了一些奇怪的技巧。 :-) –

+0

供將來參考:'NameError'與'ValueError'有很大的不同...... –

回答

4

您在創建一個元組循環:

for answer in (dictionary, dictionary2): 

之前,你可能試圖遍歷所有的字典:

for answer in dictionary: 

或者是:

for answer in (dictionary): 

這將無法正常工作;然後你只是循環一個字典的鍵。既然你沒有包含那些沒有用的代碼,我們只能推測這一點。

無論是寫一個詞典的情況下直接循環:

w.writeheader() 
w.writerow(dictionary) 

,或者使用一個元素的元組:

for answer in (dictionary,): 
    w.writerow(answer) 

Tuple syntax學習爲什麼額外的逗號是必不可少的存在。在Python中,表達式的括號是可選的,只需將該表達式分組以便跨越行或表示優先級;你至少需要一個逗號來使它成爲一個元組。

另一方面,NameError幾乎總是指向一個簡單的錯字;也許你忘了引用字典中的"B"鍵。再次,沒有追溯,這是純粹的猜測。

+0

事實上,我確實曾嘗試遍歷字典。我會將其添加到我的問題中,以便讀取它的其他人可以在那裏看到它。謝謝Martijn。你能解釋一下爲什麼在(字典)中的答案:不起作用,但在(字典)中的答案:是嗎?你說第一個實例只是循環一個字典的鍵,但後一個實例中的逗號對計算機意味着什麼,以便它知道循環鍵和一個字典的值? – user7186

+1

''(字典)'只是計算'字典':它不是元組。 '(dictionary,)',另一方面,是一個元組,其中包含一個元素。當你在'(dictionary,)'中做'答案時,你正在迭代元組,而不是迭代字典。由於只有一個項目,它只會迭代一次('answer'將被設置爲'dictionary',然後循環將停止)。 –

+0

感謝大衛的幫助 – user7186