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)

私の目標は、辞書を1つだけ持つことでした。しかし、辞書の内容を出力しようとすると、「B」に関してValueErrorが発生し続けました。私はいくつかの解決策を試しましたが、最良の解決策は、同じ正確な出力を2回出力するだけで、出力ファイルを開いたときに正確な重複を削除できる2番目の辞書を追加することでした。これはひどい習慣だと私は知っていますが、それは私が持っていた最も迅速な解決策であり、しばらくの間これに巻き込まれるのは残念でした。

この場合、なぜ2番目の辞書を追加すると機能するのですか?辞書が1つだけ使用されている場合、このコードがValueErrorをスローする理由はわかりませんが、2つある場合は正常に機能します(重複する行を除いて、削除する必要があります)。

編集

動作しないコードは次の行でした:

for answer in (dictionary):

Martijnが親切に指摘しているように、これは1つの辞書のキーをループするだけです。

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
4

1 に答える 1

4

ループするタプルを作成しました。

for answer in (dictionary, dictionary2):

以前は、おそらく辞書をループしようとしました。

for answer in dictionary:

多分:

for answer in (dictionary):

これは機能しません。次に、1つの辞書のキーだけをループします。動作しなかったコードを含めなかったので、その点についてのみ推測することができます。

ループせずに1つの辞書を直接記述します。

w.writeheader()
w.writerow(dictionary)

または、1要素のタプルを使用します。

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

余分なコンマが必要な理由については、タプル構文を参照してください。Pythonでは、式を囲む括弧はオプションであり、その式をグループ化して行をまたいだり、優先順位を示したりします。タプルにするには、少なくとも1つのコンマが必要です。

一方、NameErrorほとんどの場合、単純なタイプミスを指します。"B"辞書でキーを引用するのを忘れたのかもしれません。繰り返しますが、トレースバックがなければ、これは純粋な推測です。

于 2012-11-12T18:02:57.267 に答える