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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

Q&A

解決済

2回答

8263閲覧

Pythonでループ処理を行いJSON形式で書き出しを行いたい

ShotaYamamoto

総合スコア12

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

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

0グッド

0クリップ

投稿2018/12/27 16:07

前提・実現したいこと

Pythonで要素数の決まっていない辞書型のデータをfor文を使ってループ処理を行いJSON形式で書き出しする処理をしたい

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

書き出しを行ったJSONファイルですが以下のように、不要なダブルクォーテーションやバックスラッシュが入ってしまいます。

"{\ "0\":{\"begin\":\"2018/11/17 00:00\",\"end\":\"2018/11/17 00:00\",\"event\":\"イベント1\"}}, ""{\"1\":{\"begin\":\"2019/09/07 00:00\",\"end\":\"2019/09/07 00:00\",\"event\":\"イベント2\"}},"

該当のソースコード

Python3

1with open('mydash.json', mode="w") as q: 2 for num in range(num_lines): 3 json.dump('''{{"{0}":{{"begin":"{1}","end":"{2}","event":"{3}"}}}},'''.format(num,k[num].begin.format('YYYY/MM/DD HH:mm'),k[num].begin.format('YYYY/MM/DD HH:mm'),k[num].name),q,ensure_ascii=False)

試したこと

処理を記述して確認している際には以下の記述で表示上は問題ありませんでした。

Python3

1print({{"{0}":{{"begin":"{1}","end":"{2}","event":"{3}"}}}}.format(num,k[num].begin.format('YYYY/MM/DD HH:mm'),k[num].begin.format('YYYY/MM/DD HH:mm'),k[num].name,))

Python3

1{"0":{"begin":"2018/11/17 00:00","end":"2018/11/17 00:00","event":"イベント1"}}, 2{"1":{"begin":"2019/09/07 00:00","end":"2019/09/07 00:00","event":"イベント2"}},

以下のように記述を変更しましたが

Python3

1json.dump({{"{0}":{{"begin":"{1}","end":"{2}","event":"{3}"}}}}.format(num,k[num].begin.format('YYYY/MM/DD HH:mm'),k[num].begin.format('YYYY/MM/DD HH:mm'),k[num].name,),q,ensure_ascii=False)

以下のようなエラーが出てしまいました。

Python3

1TypeError: unhashable type: 'dict'

補足情報(FW/ツールのバージョンなど)

MacOS Mojave
Python Python 3.7.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

辞書っぽい文字列を頑張って生成するのではなく、
実際に辞書オブジェクトを作ってからdumpする方が楽だと思います。

未検証ですが、例えばこんなふうに。

Python

1tmp = { 2 num: { 3 "begin": k[num].begin.format('YYYY/MM/DD HH:mm'), 4 "end": k[num].begin.format('YYYY/MM/DD HH:mm'), # k[num].end では? 5 "event": k[num].name 6 } 7} 8json.dump(tmp, q, ensure_ascii=False)

投稿2018/12/27 16:31

LouiS0616

総合スコア35660

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

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

ShotaYamamoto

2018/12/27 21:40

色々調べすぎて視野が狭くなっていたようです。 for文以下にこのような形でつなげるだけで動くというのは考えつきませんでした。 ループ処理した要素と要素の間にカンマを入れる必要がありますが、また調べてみます。 ありがとうございます。
guest

0

辞書を作成して書き出す方法で解決できました。

Python3

1save = {} 2for num in range(num_lines): 3 save[num]={ 4 "begin" : k[num].begin.format('YYYY/MM/DD HH:mm'), 5 "end": k[num].end.format('YYYY/MM/DD HH:mm'), 6 "event": k[num].name} 7 8 9with open('mydash.json', mode="w") as q: 10 json.dump(save, q, ensure_ascii=False)

JSON

1{"0": {"begin": "2018/11/17 00:00", "end": "2018/11/20 00:00", "event": "イベント1"}, "1": {"begin": "2019/09/07 00:00", "end": "2019/09/10 00:00", "event": "イベント2"}

投稿2018/12/28 04:02

ShotaYamamoto

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問