0

这里有很多关于输出字典内容的帖子。我实际上想出了一个非最佳解决方案来解决我的问题(如下所示),但我最感兴趣的是为什么我的非最佳解决方案有效。

这是我的代码:

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 亲切地指出的那样,它只是循环遍历一个字典的键。

编辑2

而且,回溯错误是:

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
4

1 回答 1

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)

请参阅元组语法以了解为什么额外的逗号在那里是必不可少的。在 Python 中,表达式周围的括号是可选的,只是将该表达式分组为跨行或表示优先级;您至少需要一个逗号才能使其成为元组。

另一方面,aNameError几乎总是指向一个简单的错字。也许您忘记引用"B"字典中的键。同样,没有追溯,这纯粹是猜测。

于 2012-11-12T18:02:57.267 回答