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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

JSON

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1283閲覧

PythonからExcel→JSON生成方法について

pokemonta

総合スコア170

JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

JSON

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

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/11/12 04:47

編集2020/11/12 10:39

下記理想のJSONに向けて、Pythonを作りましたが
思うように作成できません。対応方法をご教示願います。
問題点は以下の通りです。
・returnの上位の{}が入っている。
・returnに""がついている。
・セルの中には、計算式を入れておりまして
そのまま表示される。ex)=$B$7&$S8
・Idが同じときには、Listの配列に追加したい。
↑実際のjsonでは、return自体が2つ出力されています。理想のjsonは、Listオブジェクトに2つ出力されています
↑"Id"ごとに(同じid)に理想のjsonが出力されます

理想のJSON

JSON

1 return { 2 "TableName": "human", 3 "Item": { 4 "Id": {"S":"12345"}, 5 "List": {"L": [{"S":"book"}, {"S":"food"}]}, 6 } 7 }

実際のJSON

JSON

1 2{ 3 "return": { 4 "TableName": "human", 5 "Item": { 6 "Id": "=$B$7&$S7", 7 "List": [ 8 { 9 "S": "=$S7&\"-\"&$E7" 10 } 11 ] 12 } 13 } 14}{ 15 "return": { 16 "TableName": "human", 17 "Item": { 18 "Id": "=$B$7&$S8", 19 "List": [ 20 { 21 "S": "=$S8&\"-\"&$E8" 22 } 23 ] 24 } 25 } 26}

python

1book = openpyxl.load_workbook('C:\temp\abc.xlsx') 2sheets = book['sheet1'] 3path_w = 'output' 4 5 6for i in range(195): 7 Id = sheets.cell(row=i + 7, column=19 + 1).value 8 S = sheets.cell(row=i + 7, column=19 + 2).value 9 10 dictA = dict() 11 dictA.setdefault("return",{}) 12 13 dict1 = { 14 "TableName" : "human" 15 } 16 dictA["return"].update(dict1) 17 18 dictB = dict() 19 dictB.setdefault("Item",{}) 20 dictA["return"].update(dictB) 21 22 dictC = dict() 23 dictC.setdefault("Id",Id) 24 dictC.setdefault("List",[]) 25 dictB["Item"].update(dictC) 26 27 dictD = { 28 "S": S 29 } 30 dictC["List"].append(dictD) 31 32 with open(path_w, mode='a') as f: 33 f.write(json.dumps(dictA, sort_keys=False, ensure_ascii=False,indent=4))

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

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

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

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

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

t_obara

2020/11/12 06:31

エクセルを利用せずにすべてをPythonで行うという選択肢は取れないのでしょうか?
pokemonta

2020/11/12 07:27

やっぱこれは無理なのでしょうか? Excelで文字列を生成していますので、これができれば省力化できると考えています。 =$B$7&$S7 部分をExcelで値に置き換えることは可能です
guest

回答1

0

ベストアンサー

openpyxlでブックを開くときにdata_only=Trueをつけると、計算の結果が得られるようになります。

また、理想のJSONとして書かれているものは、正しいJSONではないのでjson.dumps()では出力できません。
returnを含まないものをJSON文字列として作成して、'return 'を前にくっつければいいのではないでしょうか。

・Idが同じときには、Listの配列に追加したい。

Idごとに出力したいということならば、全データを読み込んだ後、
Idごとに出力する別のループが必要です。
(dict.setdefaultはわかりにくいので使わずに書きました)

python

1book = openpyxl.load_workbook('C:\temp\abc.xlsx', data_only=True) 2sheets = book['sheet1'] 3path_w = 'output' 4 5data_dict = dict() 6 7for i in range(195): 8 Id = sheets.cell(row=i + 7, column=19 + 1).value 9 S = sheets.cell(row=i + 7, column=19 + 2).value 10 11 if Id not in data_dict: 12 data_dict[Id] = { 13 "TableName": "human", 14 "Item": { 15 "Id": {"S": Id}, 16 "List": {"L": []} 17 } 18 } 19 20 data_dict[Id]['Item']['List']['L'].append({"S": S}) 21 22# ファイル出力 23with open(path_w, mode='a') as f: 24 for Id in data_dict.keys(): 25 json_str = json.dumps(data_dict[Id], sort_keys=False, ensure_ascii=False, indent=4) 26 f.write('return ' + json_str + '\n') 27

投稿2020/11/12 08:25

編集2020/11/12 12:11
bsdfan

総合スコア4794

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

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

pokemonta

2020/11/12 08:51

ありがとうございます。 >理想のJSONとして書かれているものは、正しいJSONではないので これは、どういう意味でしょうか?(何をもって正しいjsonというのでしょうか? >こちらについては、いまいちやりたいことがわからないため、回答できません。 Listにオブジェクトを2つ追加したいのに対して、実際にはreturnオブジェクト自体が2つ出力されます
bsdfan

2020/11/12 09:21

https://docs.python.org/3/library/json.html こちらの最初にも書かれていますが、JSONはRFCやECMAで規格が決まっているので、前にreturnとかがついたものはJSONとは違うものです。jsonのライブラリではそう言うものは直接扱えないです。 > Listにオブジェクトを2つ追加したいのに対して、実際にはreturnオブジェクト自体が2つ出力されます ループごとにファイルに出力してますが、最後に一回出力するイメージですか?
pokemonta

2020/11/12 10:36

>ループごとにファイルに出力してますが、最後に一回出力するイメージですか? "Id":ごとにファイル出力するイメージですね。 私の質問がわるいですね
pokemonta

2020/11/12 12:25

これ、すげーですね ありがとうございます。 自分じゃこの発想なかっです
bsdfan

2020/11/12 13:10

よく使われるパターンだと思いますので、覚えておくといいかもです。 私もどっかで見た似たようなのに、ちょこっと手を加えただけです。
pokemonta

2020/11/13 06:25

あれ、同じIDで複数JSONが生成されます
bsdfan

2020/11/13 06:41

同じIDで複数JSONが生成される要因が思いつかないです。 - mode="a" で出力しているので、以前の結果が残っているのではないか - 見た目は同じだけど実際は違うID(全角・半角、スペース等)ではないか について確認してみてください。
pokemonta

2020/11/13 07:09

解決しました。 with構文がforの中にはいってました。 お騒がせしました。
pokemonta

2020/11/13 07:12

逆にIDが3つあった時に3つしか出力されない新たな問題が発生しました
bsdfan

2020/11/13 07:13

状況を整理して、別質問をたててもらったほうが良さそうです。
pokemonta

2020/11/13 07:18

いけました。すみません json.dumps(data_dict[Id],・・・  ↓ json.dumps(data_dict・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問