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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2028閲覧

DictWriterでCSVに書き出したい

memento

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/12/14 02:13

前提

pythonで辞書型のデータをCSVに出力しようとしています。実行するとAttributeError: 'str' object has no attribute 'keys'が出てしまい、うまく動作しません。

当該エラーを調べ、型のチェックを行い、扱っているデータがdictであることを確認しました。

何が問題なのでしょうか。ご教示いただければ幸いです。

実現したいこと

辞書データをcsvに書き出したい。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "c:\Users\user\Documents\GitHub\scripts\csvDecWrite.py", line 16, in <module> writer.writerows(urllist) File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\csv.py", line 157, in writerows return self.writer.writerows(map(self._dict_to_list, rowdicts)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\csv.py", line 147, in _dict_to_list wrong_fields = rowdict.keys() - self.fieldnames ^^^^^^^^^^^^ AttributeError: 'str' object has no attribute 'keys'

該当のソースコード

python

1import csv 2 3urllist = {} 4 5urllist.setdefault("a","url1") 6urllist.setdefault("a","url2") # 追加されないことを確認 7urllist.setdefault("b","url1") 8urllist.setdefault("c","url1") 9 10print(type(urllist)) # ここの型はdict 11print(type(urllist["a"])) # ここの型はstr 12 13with open("url.csv","w",newline='') as f: 14 writer = csv.DictWriter(f, fieldnames = ["name","url"]) 15 writer.writeheader() 16 writer.writerows(urllist) 17 18#### 19# 実行すると 20# AttributeError: 'str' object has no attribute 'keys' 21# が帰ってきてしまいます。 22####

試したこと

当該エラーを検索し、データ型が文字列ではなく辞書であることを確認しました。

何か非常に基本的な見落としがあるのだと思います。ほうぼう検索し一晩考えたのですが解決できませんでした。ご助言頂けるとありがたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

urllistがDictWriterが期待する形式になっていないからです。
urllistはリストですから、dictではなくdictのリストになっていなければなりません。 直すとこんな感じでしょう。

python

1import csv 2 3urllist = [{"name": "a", "url": "url1"}, 4 {"name": "b", "url": "url2"}, 5 {"name": "c", "url": "url3"}] 6 7with open("url.csv","w",newline='') as f: 8 writer = csv.DictWriter(f, fieldnames = ["name","url"]) 9 writer.writeheader() 10 writer.writerows(urllist)

投稿2022/12/14 02:34

TakaiY

総合スコア12763

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

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

memento

2022/12/14 03:37

ご回答ありがとうございます!DictWriterが求めているのはKeyにheaderの情報が入った辞書データだったのですね。 今後はちゃんとドキュメントを確認するようにします。 https://docs.python.org/ja/3/library/csv.html
guest

0

python

1with open("url.csv","w",newline='') as f: 2 writer = csv.writer(f) 3 writer.writerow(["name","url"]) 4 writer.writerows(urllist.items())

投稿2022/12/14 02:34

編集2022/12/14 02:36
melian

総合スコア19754

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

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

memento

2022/12/14 03:57

ご回答ありがとうございます!そのままの辞書データで動作するスクリプトを書いて頂けて助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問