2012-11-12 68 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