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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

JSON

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

1006閲覧

配列を特定のキー,階層にした状態で、JSON形式に変換したい

sh0u

総合スコア17

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

JSON

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2023/01/27 15:02

編集2023/01/27 15:03

前提

Google Spread Sheet APIを使用しています。

各行の内容を配列に格納,ソート後、
特定のキー,階層に編集後、JSONファイルとして出力するスクリプトを作ろうとしています。

しかし下記にあるように、想定していたものとは違う形式のJSONファイルが出力されてしまいます。
どうすれば解決するでしょうか。

実現したいこと

  • 配列の内容を、各行ごとのデータに分割させた状態で、JSONファイルに出力させる

(該当行:33~43行目)

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

  • 期待している出力結果

py

1{ 2 "value": "テスト項目", 3 "image": { 4 "sourceUri": "https://*****" 5 } 6}, 7{ 8 "value": "テスト項目2", 9 "image": { 10 "sourceUri": "https://*****" 11 } 12}, 13# ~~~~~以下、同様の階層が続く
  • 実際の出力結果

value:
配列の内容が一気に出力されてしまう(['aaa'], ['bbb'], といったように、各行の内容が1行にまとまってしまう)
sourceUrl:
本来は1つのカッコ内に1つのみ要素が入るところが、複数個要素が配置されてしまっている
イメージ説明

該当のソースコード

py

1import gspread 2import json 3from oauth2client.service_account import ServiceAccountCredentials 4 5SHEET_ID = "*****" 6GCPKEY = "key.json" 7JSON_EXP = "avatarsInfo.json" 8 9 10def connect_gspread(jsonf, key): 11 scope = ['https://spreadsheets.google.com/feeds', 12 'https://www.googleapis.com/auth/drive'] 13 credentials = ServiceAccountCredentials.from_json_keyfile_name( 14 jsonf, scope) 15 gc = gspread.authorize(credentials) 16 SPREADSHEET_KEY = key 17 worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1 18 return worksheet 19 20 21ws = connect_gspread(GCPKEY, SHEET_ID) 22 23# 範囲定義 24avatarNames_JA = ws.get_values("A:A") 25avatarNames_EN = ws.get_values("B:B") 26avatarImageUrl = ws.get_values("F:F") 27 28# 一括ソート 29zip_lists = zip(avatarNames_JA, avatarNames_EN, avatarImageUrl) 30zip_sort = sorted(zip_lists) 31avatarNames_JA, avatarNames_EN, avatarImageUrl = zip(*zip_sort) 32 33json_dict = { 34 "value": f'{avatarNames_JA}({avatarNames_EN})', 35 "image": { 36 "sourceUri": avatarImageUrl 37 } 38} 39 40# JSON生成 41with open(JSON_EXP, "w")as f: 42 json.dump(json_dict, f, indent=4) 43

試したこと

Read & write cell values - Google Developers
https://developers.google.com/sheets/api/guides/values

Python から JSON へ変換 - やさしいPython入門
https://python.softmoco.com/basics/python-json-dump.php

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

Visual Studio Code 1.74.3
python 3.11(Microsoft Store)
Google SpreadSheet API

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

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

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

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

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

guest

回答1

0

ベストアンサー

(※ 修正×2)
pythonは勝手にくりかえしのデータを作ってくれたりはしないので、自分でそういうデータにする必要があります。

python

1zip_sort = sorted(zip_lists) 2 3res_json_list = [] 4for name_ja, name_en, image_url in zip_sort: 5 6 json_dict = { 7 "value": f'{name_ja}({name_en})', 8 "image": { 9 "sourceUri": image_url 10 } 11 } 12 res_json_list.append(json_dict) 13 14# JSON生成 15with open(JSON_EXP, "w")as f: 16 17 json.dump(res_json_list, f, indent=4)

投稿2023/01/27 15:16

編集2023/01/27 15:58
TakaiY

総合スコア12779

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

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

sh0u

2023/01/27 15:37

回答ありがとうございます。 提示されたコードに編集し,実行を試みましたが、「too many values to unpack (expected 3)」エラーが発生し、正常に動作しませんでした。 また、提示されたコードを元に、以下の様に編集を行いましたが、 階層自体は変わったものの、依然同様の問題が発生してしまいます。 出力結果: https://imgur.com/a/cecDouN コード ```py # 一括ソート zip_lists = zip(avatarNames_JA, avatarNames_EN, avatarImageUrl) zip_sort = sorted(zip_lists) # zip(*)関数のコメントアウトを解除 avatarNames_JA, avatarNames_EN, avatarImageUrl = zip(*zip_sort) res_json_list = [] # for文をavatarNames_JA の要素数を返すよう変更 for i in range(len(avatarNames_JA)): json_dict = { "value": f'{avatarNames_JA}({avatarNames_EN})', "image": { "sourceUri": avatarImageUrl } } res_json_list.append(json_dict) # JSON生成 with open(JSON_EXP, "w")as f: json.dump(res_json_list, f, indent=4) ```
TakaiY

2023/01/27 15:50 編集

データの構造を勘違いしていました。 以下のループについていたzip関数は不要でした。 for avatarNames_JA, avatarNames_EN, avatarImageUrl in zip_sort: 修正しました。 これでどうですかね
TakaiY

2023/01/27 15:57

改めてみてみると、もう一段見落しているところがありました。 コードはこれで動くと思うのですが、変数名の扱いが変ですね。 元のコードの avatarNames_JA, avatarNames_EN, avatarImageUrl = zip(*zip_sort) これって、並べ替えたあとに元のリストに入れなおしているんですね。 それ気づきませんでした。 僕のコードのループ変数もこの変数になっていますが、よくありませんね。 並べ替えたzipされたリストから順に3つの組を取り出して使うので、別名の変数にしたほうがわかりやすかったと思います。 (直します)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問