【python3】jsonを受け取ってCSV形式のstrに変換する

またそういう微妙なものが必要になる。

やりたいこと

jsonで届いたデータをCSVにしてFTPアップロードする仕組みが欲しい

……だけなんですが、ローカルなら一旦tempファイルを作ってそれをアップロードすれば良いんで話は早いんですけど、クラウド上でやろうとすると「ほいっ、ほいっ」とあっちのファイルをFTPでぶん投げて、という訳にはいかず。(ぶん投げる訳に行く方法ご存じの方がいらっしゃいましたらご教示頂きたく)
そこで、一旦メモリ上にストリーム作ってそれをFTPでぶん投げることにする。
そのために、一旦jsonを分解して、カンマ区切り&改行付きのテキストデータにするところまでを用意しました。

結論

import pandas as pd
import json
from pandas.io.json import json_normalize

class CsvString:
   def __init__(self, json) -> None:
       self.csv_string = self.__formatCsv(json)
       
   def __formatCsv(self,json) -> str:
       df = pd.read_json(json)
       df_json = json_normalize(df["data"])
       csv_string = df_json.to_csv(header=True, index=False)
       return csv_string

# サンプルデータを作って実行してみる
if __name__ == '__main__':
   json_text = {"data":[
           {"item_code":"hoge","quantity":"1"},
           {"item_code":"fuga","quantity":"2"}
   ]}
   json_dumped = json.dumps(json_text)
   csv_from_json = CsvString(json_dumped)

肝:to_csvからstringを受け取る方法

csv_string = df_json.to_csv(header=True, index=False)

to_csvにファイル名とかエンコードとか渡しちゃうとファイルが出力されてしまうけど、渡さずに実行すればString型のテキストオブジェクトで取得できる。

ちなみにprintすると

item_code,quantity
hoge,1
fuga,2

良い感じに取れている。

改行コードが引っかかる時は\nを\r\nにしてみるとかで対応できそう。

こちらの記事が大変参考になりました。

肝2:json_normalizeで入れ子を展開

jsonが入れ子になっていると上手く取り出せないけど、json_nomalizeを使うことでなんかこう良い感じに展開してくれます。今回はそこまで深い入れ子でデータを受け取る予定ではないのですが、それでも

[ { key1:val1,key2:val2 } , { key1:val3, key2:val4 } , ...]

って構造になってると必要みたい。

その辺りはこちらの記事を参考に。


この記事が気に入ったらサポートをしてみませんか?