質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

11916閲覧

csvに辞書データを書き込みたいが上手くいかない

kaitotokai

総合スコア59

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/08/04 10:17

csvに辞書データを書き込みたいが上手くいかないです。

user={"Tom":["AmericaCalforniaSan Diego2-3-40"],"Juddy":["AustorariaNew South WalesSydneyRyde city1-60"]} with open("tmp.csv","w") as f: fieldnames = ['NAME', 'ADRESS'] writer = csv.DictWriter(f, fieldnames=fieldnames, extrasaction='ignore',delimiter=';') writer.writeheader() writer.writerow(user)

とコードを書いて実行すると、
NAME&ADRESSのヘッダーのみがcsvに書き込まれ、userの辞書データが書き込まれません。
しかしエラーは出ていません。

writer.writeheader() print(user) writer.writerow(user)

でユーザー情報を取得できるか確認すると、取得できました。

NAME           ADRESS Tom            AmericaCalforniaSan Diego2-3-40 Juddy AustorariaNew South WalesSydneyRyde city1-60

のようにcsvに書き込みたいのですが、何が問題なのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

短い利用例:

python

1import csv 2 3with open('names.csv', 'w', newline='') as csvfile: 4 fieldnames = ['first_name', 'last_name'] 5 writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 6 7 writer.writeheader() 8 writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) 9 writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'}) 10 writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'}) 11

14.1. csv --- CSV ファイルの読み書き — Python 3.6.6 ドキュメント #csv.DictWriter

フィールドと辞書のキーを一致させる必要があるようです。だから、

python

1{"NAME":"Tom", "ADRESS":"AmericaCalforniaSan Diego2-3-40"}

みたいな辞書を作って渡すというのが一つの手。

でも面倒くさいので、通常のwriterとforループの組み合わせで書いていった方が良いのではないでしょうか。

投稿2018/08/04 10:25

編集2018/08/04 10:27
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaitotokai

2018/08/04 10:32

ありがとうございます。辞書を作り直すのはできません・・・。「通常のwriterとforループの組み合わせで書いていった方が良いのではないでしょうか」とのことですが、どのようなものをイメージしていますか?ちょっと理解できなくて。 もしよかったら回答にコードを乗せてもらえないでしょうか?
hayataka2049

2018/08/04 10:40 編集

ヘッダをwriterowなりで書いてから、辞書のキーと値をループで取り出して一行ずつ書いていけばいいですね。ご自身で書けませんか? 辞書を作り直すのはできない・・・とはどういうことでしょう? そっちだってやろうと思えばやれるはずですが。適当にループを回して新しく辞書のリストを作るだけです。
kaitotokai

2018/08/04 10:48

writer = csv.writer(f) for key,value in user.items(): writer.writerow(key) writer.writerow(value)
kaitotokai

2018/08/04 10:49

という感じをイメージされてますか?このコードを実行すると、文字ごとに書き込まれてしまいます・・・。
kaitotokai

2018/08/04 10:50

辞書を作り直すことができないと書いた理由は、キーを必ず名前にしたいからです。
hayataka2049

2018/08/04 10:50

いや、それは間違いです。 csv.writer.writerowの引数はリストなので、リストに入れてください。あと、valueの方は(理由はよくわかりませんが)リストに入っているので、取り出してあげてください。
hayataka2049

2018/08/04 10:51 編集

今あるuserとは別に、書き込み用の辞書を作ればいいというつもりで書いたのですが>辞書を作り直すことができないと書いた理由
kaitotokai

2018/08/04 11:00

ありがとうございます!できました!
guest

0

csv.DictWriter使わないほうがいいんじゃないでしょうか。

python

1import csv 2user={ 3 "Tom":["AmericaCalforniaSan Diego2-3-40"], 4 "Juddy":["AustorariaNew South WalesSydneyRyde city1-60"] 5} 6 7fieldnames = ['NAME', 'ADRESS'] 8 9with open("tmp.csv", "w") as f: 10 writer = csv.writer(f, delimiter=';') 11 12 # ヘッダー 13 writer.writerow(fieldnames) 14 15 # 各行 16 for Name, address in user.items(): 17 writer.writerow((Name, address[0])) 18 19 # 各行のfor文はこんな風にも書けます。(ジェネレータ内包表記を利用) 20 # writer.writerows((Name, address[0]) for Name, address in user.items()) 21

投稿2018/08/04 10:55

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問