输出Python字典的内容

时间:2012-11-12 17:58:20

标签: python csv

这里有很多关于输出字典内容的帖子。我实际上找到了解决问题的非最佳解决方案(我将在下面展示),但我最感兴趣的是为什么我的非最佳解决方案有效。

这是我的代码:

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):

正如Martijn所指出的那样,只是循环遍历一个字典的键。

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

1 个答案:

答案 0 :(得分: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"键。再次,没有追溯,这是纯粹的推测。