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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

1042閲覧

Excelデータに書き出したい

Kirari

総合スコア32

JSON

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

Python 3.x

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

0グッド

2クリップ

投稿2020/01/27 05:14

編集2020/01/27 07:12

前提・実現したいこと

JSONデータをpythonを使ってEXCELデータに書き出したいのです。
下記のコードで、EXCELデータはできたのですが、発生している問題に記載したようになってしまいます。

改行の位置を変えたり等しましたが、うまくいきませんでした。
大変申し訳ございませんが、アドバイスいただけないでしょうか。

<もとデータ> JSONデータ
No.1データ
送信元:XXXXXX
番号:123456
日付:2020-01-27
内容:本日は晴天なり
送信先:YYYYYY

No.2データ
送信元:ZZZZZZ
番号:234567
日付:2020-01-28
内容:本日はありがとう
送信先:SSSSSS

<やりたいこと>

【excel】    A        B        C          D        E 1 XXXXXX 123456 2020-01-27   本日は晴天なり   YYYYYY 2 ZZZZZZ 234567 2020-01-28   本日はありがとう  SSSSSS

<追記>print(jm)

'send_time': 10桁数字, 'update_time': 0}, {'message_id': '123456', 'account': {'account_id': 7桁数字, 'name': 'XXXXXX', 'avatar_image_url': 'チャットワークのリンク先'}, 'body': '[To:7桁数字]YYYYYYさん\n本日は晴天なり。','send_time': 10桁数字, 'update_time': 0}, {'message_id': '234567', 'account': {'account_id': 7桁数字, 'name': 'ZZZZZZ', 'avatar_image_url': 'チャットワークのリンク先'}, 'body': '[To:7桁数字]SSSSSSさん\n本日はありがとう',

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

【excel】    A        B        C          D        E 1 XXXXXX 123456 2020-01-27   本日は晴天なり   XXXXXX 2 ZZZZZZ 234567 2020-01-28   本日はありがとう  ZZZZZZ →A列とE列が同じになっている。

該当のソースコード

python3

1import datetime 2import requests 3import json 4 5headers = {‘APIトークン’, } 6 7mes = requests.get('Http(ルーム番号含む)',headers=headers) 8jm=json.loads(mes.text) 9 10 11import xlsxwriter 12wb = xlsxwriter.Workbook('C:/Users/XXXXXXXX/Desktop/out.xlsx') 13ws1 = wb.add_worksheet('sheet') 14 15row_index=0 16for i in jm: 17 name=i.get("account").get("name") 18 daytime=datetime.datetime.fromtimestamp(i.get("send_time")) 19 mid=i.get("message_id") 20 body=i.get("body") 21 name1=i.get("name1") 22 print("\n--------------------------------------------") 23 print("{n}({i}):{d}\n{b}".format(n=name,i=mid,d=daytime,b=body)) 24 print("--------------------------------------------") 25 26 if name: 27 ws1.write(row_index, 0, name) 28 29 if mid: 30 ws1.write(row_index, 1, mid) 31 32 if daytime: 33 ws1.write(row_index, 2, daytime) 34 35 if body: 36 ws1.write(row_index, 3, body) 37 38 if name1: 39 ws1.write(row_index, 4, name1) 40 41 row_index=row_index+1 42 43wb.close() 44

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

can110

2020/01/27 06:11

提示されたJSONデータだと階層構造や各キー名、値なとが不明で検証困難です。 primt(jm)した結果を提示されると回答得られやすくなります。
Kirari

2020/01/27 06:38 編集

ありがとうございます。以下のようになります。 'send_time': XXXXXXXXXX, 'update_time': Y}, {'message_id': 'ZZZZZZZZZZ', 'account': {'account_id': PPPPPPPPPPPPP, 'name': 'OOOOOOOOOOOO', 'avatar_image_url': 'https://xxxxx/com'}, 'body': '[To:iiiiii]SSSSSSさん\n本日は晴天なり。',
can110

2020/01/27 06:56

提示結果には、{}の対応関係があっていない、囲み文字で囲まれていない文字列PPPPPPPなどが含まれている、コード上に記載している'name1'というキーがない、などの矛盾があります。 print(jm)の一部のみ取り出したり加工などしていないでしょうか? もしprint結果をここにそのまま提示するのに不都合がある場合は 「No.1データ」~「No.2データ」で示しているのと同じ内容が含まれるJSONデータを 正しいJSONデータ形式({}の対応関係があっている、文字列は""で囲まれているなど)で提示ください。 なお、この欄だと改行やインデントが反映されないため、質問本文を修正するかたちで提示ください。
Kirari

2020/01/27 07:13

すみません。ありがとうございます。本文中に追記させていただきました。どうぞよろしくお願いいたします。
can110

2020/01/27 08:32

依然として正しいJSON形式になっておらず、第三者が検証できないデータとなっております。 ちなみに変数「jm」の型は本当にJSONでしょうか? JSON形式のデータをそのままprintした結果には見えません。もしかして文字列とかではないでしょうか?
Kirari

2020/01/27 08:36

すみません、print(jm)とすると、文字列が出てきました。
can110

2020/01/27 08:42

文字列としてprintされるのは動作としては正しいです。 しかし提示されている表示結果がJSONデータをprintした結果とは思えないのです(と思いません?)。 とりあえず「print(type(jm))」と「print(len(str(jm)))」した結果を提示ください。
guest

回答1

0

ベストアンサー

ぱっと見ですが

name=i.get("account").get("name") daytime=datetime.datetime.fromtimestamp(i.get("send_time")) mid=i.get("message_id") body=i.get("body") name1=i.get("name")

最終行、get("name")で大丈夫ですか?

投稿2020/01/27 05:28

mkk

総合スコア378

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

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

Kirari

2020/01/27 05:35

すみません、ご指摘ありがとうございます。name1=i.get("name1")に修正しましたが、表記の発生メッセージが出ます。
mkk

2020/01/27 11:13 編集

追記のJSONデータ、確認しました。 初めに記載してあったものを見てJSONのKeyに「name1」があるのかと思って回答しましたが、 見たところありませんね? 「body」の中に、「本日は晴天なり。」とかと一緒に入ってしまっていますよね。 JSONの送る側できちんと分けて送信した方がいいですが、それができないのであれば「body」を取得したのち、 文字列操作をして送信先を取得する必要があります。 上記を見て言っていることが分からないということであれば、まずはJSONがどのようなものか調べられた方が良いかと思います。 今回の件が解決しても、エラーが出た時に原因の特定ができなくなってしまいます。 例えばこちらなどはいかがでしょう。 http://www.tohoho-web.com/ex/json.html
Kirari

2020/02/06 01:24 編集

ありがとうございます。やってみます。また質問させていただきます。よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問