1

私の質問にはたくさんの順列がありましたが、最も近い答えは次のとおりです。

Python 辞書を csv ファイルに書き込むにはどうすればよいですか?

残念ながら、次のように各行に出力が出力されます。

matthew, green
rachel, blue
raymond, red

where somedict = dict(raymond = "赤", レイチェル = "青", マシュー = "緑")

私の問題には、次のような出力が必要です。

why, date, story
"because", "sunday", "blah blah blah"

ユーザー入力から辞書を取得しています。出力ファイルでは、(理由、日付、ストーリー) に対するそれぞれの新しい回答を新しい行に配置することが重要です (さらに、列ヘッダーは 1 回だけ出力されます)。したがって、私のコードは次のようになります。

import csv
o = "file.csv"
why = input("Why? ")
date = input("Date: ")
story = input("Story: ") 

要約すると、次のような出力が必要です。

why, date, story
"because", "sunday", "blah blah blah"
"i don't know", "monday", "blah blah blue"
"third base", "monday", "blah blah blarg"

ユーザー入力を取得し、csv ファイルの新しい行に書き込む簡単な方法を探していました。私はこれで約2時間過ごしたので、ここにいます。最初に 2 つの TypeError エラーが発生しました: (1) 'str' はバッファー インターフェイスをサポートしていません (これは with open(file, "wb", "utf-8") ステートメントに "utf-8" パラメーターを追加することで解決しました) )。(2) TypeError: 整数が必要です。何らかの理由で「wb」から「b」を削除したところ、このエラーは解消されたようです。私が投稿したリンクは、必要な場所にほぼ到達しますが、十分ではありません。誰かが提供できる迅速な説明を心から感謝します.

編集

明確にするために、いくつかの可能性を試しました。最も有望なのは次のとおりです。

with open("file.csv", "w", encoding = "utf-8") as f:
    w = csv.writer(f)
    w.writerows(somedict.items())

上記で引用した最初の出力が生成されましたが、これは必要なものではありません。

私も試しました:

with open("file.csv", "w", encoding = "utf-8") as f:
    w = csv.writer(f)
    w.writerow(somedict.keys())
    w.writerow(somedict.values())

しかし、これは私に与えました: _csv.Error: sequence expected

4

3 に答える 3

5

ユーザー入力を取得してcsvファイルの新しい行に書き込むだけの場合は、辞書なしで実行できます。辞書でそれを行うことは、実際には辞書がどのように設定されているかに依存します-これについてもう少し説明すると役立つかもしれませんか?それが私が想像している方法であるならば、kalgasnikの答えは良いものです。

しかし、偶然にも辞書は必要ありません(あなたの質問からの私の一般的な印象)、この方法は非常に簡単です:

import csv
with open('file.csv', 'w') as f:
    w = csv.writer(f, quoting=csv.QUOTE_ALL) 

    while (1):
        why = input("why? ")
        date = input("date: ")
        story = input("story: ")
        w.writerow([why, date, story])

これにより、ユーザー入力から直接必要な出力が生成されます。

編集

この方法は、単にデータを何度も何度も取り込む場合、つまりwhile(1)(永久ループ)の場合のために設計されています。セットを一度に1つずつ取り込みたい場合は、whileループを完全に削除します。これは、最後にブレークを追加するのと同じ効果があります。

各書き込みの間にファイルを開いたり閉じたりする場合(たとえば、その間に他の多くの作業を行う場合)、ファイルを開くときに「w」の代わりに「a」を使用して追加します。新しい行の新しい文字列のセット。

これは、すべてのセットをどこかに保存してから、最後にすべてのセットをファイルに書き込むのが良い場合の例かもしれません。これは、ファイルを常に開いたり閉じたりするのにコストがかかる可能性があるためです(これかどうかはわかりません)。あなたのための考慮事項です)。それでも辞書に慣れていない場合は、[理由、日付、ストーリー]の各リストをより大きなリストに追加し、最後にリストをループして最後に書くことができます。

于 2012-09-29T00:58:35.777 に答える
1

「残念ながら、各行に出力が出力されます」-正しく理解できれば、それがあなたの解決策です

i1 = {"why": "because", "date": "sunday", "story": "blah blah blah"}
i2 = {"why": "i don't know", "date": "monday", "story": "blah blah blue"}
i3 = {"why": "third base", "date": "monday", "story": "blah blah blarg"}

keys = ("why", "date", "story")
with open('mycsvfile.csv','wb') as f:
    w = csv.DictWriter(f, keys)
    w.writeheader()
    for answer in (i1,i2,i3):
        w.writerow(answer)
于 2012-09-29T00:45:27.693 に答える
0

csv.writerquotingパラメーターは、書き込み時にフィールドを引用するかどうかを制御します。このパラメーターの値をcsv.QUOTE_ALLに設定すると、すべてのフィールドが引用されます。

于 2012-09-29T00:30:08.757 に答える