PythonでCSV>JSON・JSON>CSV変換

PythonでCSV・JSON変換
スポンサーリンク
スポンサーリンク

CSVをJSONに変換して出力する方法、JSONからCSVに変換する方法について解説します。

スポンサーリンク

使用ライブラリ

 モジュール :csv(公式ドキュメント
 インストール:不要
 モジュール :json(公式ドキュメント
 インストール:不要

CSVファイルをJSONに変換してファイル出力

日時・温度・湿度データが記録されているCSVファイル(sensor.csv)を、JSONに変換してファイルを出力するサンプルです。

sensor.csv の中身は以下のようなカンマ区切りのデータになります。
これをJSON {“key” : “value”} 形式に変換します。

datetime,temp,humid,type
2022/8/19 21:30:00,28.2,62.0,温湿度
2022/8/19 21:31:00,28.3,61.7,温湿度
2022/8/19 21:32:00,28.4,61.5,温湿度
2022/8/19 21:33:00,28.2,61.8,温湿度
2022/8/19 21:34:00,28.0,61.9,温湿度

output.jsonの出力結果は以下のようになります。

[{‘datetime’: ‘2022/8/19 21:30:00’, ‘temp’: ‘28.2’, ‘humid’: ‘62.0’, ’type’:’温湿度’}, {‘datetime’: ‘2022/8/19 21:31:00’, ‘temp’: ‘28.3’, ‘humid’: ‘61.7’, ’type’:’温湿度’}, {‘datetime’: ‘2022/8/19 21:32:00’, ‘temp’: ‘28.4’, ‘humid’: ‘61.5’, ’type’:’温湿度’}, {‘datetime’: ‘2022/8/19 21:33:00’, ‘temp’: ‘28.2’, ‘humid’: ‘61.8’, ’type’:’温湿度’}, {‘datetime’: ‘2022/8/19 21:34:00’, ‘temp’: ‘28.0’, ‘humid’: ‘61.9’, ’type’:’温湿度’}]

プログラム解説

プログラムを解説します。

#  CSVファイルの読み込み
with open(‘sensor.csv’, ‘r’) as f:
        dreader = csv.DictReader(f)
        d_list = [row for row in dreader]

CSVファイルを open() 関数で読み取り専用として開き、CSVファイルの内容を辞書型で読み込み dreader に格納します。
さらに、読み込んだデータを2次元配列で d_list に格納します。

・関連記事:PythonでCSVファイルを読み込み・書き込み(入力・出力)

d_list の中身は以下のようになります。
[{‘datetime’: ‘2022/8/19 21:30:00’, ‘humid’: ‘62.0’, ‘temp’: ‘28.2’, ’type’:’温湿度’},
 {‘datetime’: ‘2022/8/19 21:31:00’, ‘humid’: ‘61.7’, ‘temp’: ‘28.3’, ’type’:’温湿度’},
 {‘datetime’: ‘2022/8/19 21:32:00’, ‘humid’: ‘61.5’, ‘temp’: ‘28.4’, ’type’:’温湿度’},
 {‘datetime’: ‘2022/8/19 21:33:00’, ‘humid’: ‘61.8’, ‘temp’: ‘28.2’, ’type’:’温湿度’},
 {‘datetime’: ‘2022/8/19 21:34:00’, ‘humid’: ‘61.9’, ‘temp’: ‘28.0’, ’type’:’温湿度’}]

 
# JSONファイルへの書き込み
with open(‘output.json’, ‘w’) as f:
        json.dump(d_list, f, ensure_ascii=False)

jsonデータ出力用のファイルを open() 関数の書き込みモードで開きます。

json.dump() で、第一引数で指定した二次元配列を、第二引数の出力用ファイルに書き出します。

また、データに日本語を含む場合は、引数に ensure_ascii=False を指定します。
指定しないと、"type": "\u6e29\u6e7f\u5ea6" のように非 ASCII 文字はエスケープされてしまいます。

ちなみに json.dumps() もありますが、dump() との違いは、後述のように文字列として出力する場合に使用します。

CSVファイルをJSONに変換して文字列出力

日時・温度・湿度データが記録されているCSVファイル(sensor.csv)を、JSONに変換して文字列を出力するサンプルです。

出力結果は以下のようになります。

# [{“datetime”: “2022/8/19 21:30:00”, “temp”: “28.2”, “humid”: “62.0”, “type”: “温湿度”}, {“datetime”: “2022/8/19 21:31:00”, “temp”: “28.3”, “humid”: “61.7”, “type”: “温湿度”}, {“datetime”: “2022/8/19 21:32:00”, “temp”: “28.4”, “humid”: “61.5”, “type”: “温湿度”}, {“datetime”: “2022/8/19 21:33:00”, “temp”: “28.2”, “humid”: “61.8”, “type”: “温湿度”}, {“datetime”: “2022/8/19 21:34:00”, “temp”: “28.0”, “humid”: “61.9”, “type”: “温湿度”}]

プログラム解説

CSVファイルの読み込みは、上述のファイル出力の場合のプログラムと同様です。

# 文字列として出力
json_text = json.dumps(d_list, ensure_ascii=False)

文字列で出力する場合は、json.dumps() を使用します。
また、日本語の文字化けを回避するために ensure_ascii=False を指定します。

json.dump() とすると TypeError: dump() missing 1 required positional argument: 'fp' というエラーになります。dump はファイルオブジェクトに書き込む関数のため、このエラーが発生します。

JSONファイルをCSVに変換して出力

日時・温度・湿度データが記録されているJSONファイル(output.json)をCSVファイルに変換して出力するサンプルです。

以下のようなCSVファイルが出力されます。

“datetime”,”temp”,”humid”,”type”
“2022/8/19 21:30:00″,”28.2″,”62.0″,”温湿度”
“2022/8/19 21:31:00″,”28.3″,”61.7″,”温湿度”
“2022/8/19 21:32:00″,”28.4″,”61.5″,”温湿度”
“2022/8/19 21:33:00″,”28.2″,”61.8″,”温湿度”
“2022/8/19 21:34:00″,”28.0″,”61.9″,”温湿度”

プログラム解説

# JSONファイルのロード
with open(‘output.json’, ‘r’) as f:
        json_dict = json.load(f)

open() 関数で JSON ファイルを読み取りモードで開き、json.load() でJSON文字列を辞書に変換します。

# CSVファイルに書き込み
with open(‘sensor_output.csv’, ‘w’, newline=”) as f:
  writer = csv.DictWriter(f, fieldnames=json_dict[0].keys(),
              doublequote=True,
              quoting=csv.QUOTE_ALL)
  writer.writeheader()
  writer.writerows(json_dict)

open() 関数で、出力用のCSVファイルを書き込みモードで開きます。

csvモジュールの Dictwriter() メソッドで writer オブジェクトを生成します。
引数を説明します。
fieldnames=json_dict[0].keys()json_dict[0] で辞書の1番目の要素を抜き取り、keys() でキー情報を取得します。dict_keys(['datetime', 'temp', 'humid', 'type'])
doublequote=True : 引用符が文字内に含まれる場合も、ダブルクオーテーションで囲みます。
quoting=csv.QUOTE_ALL : 全てのフィールドを引用符で囲みます。

・関連記事:PythonでCSVファイルを読み込み・書き込み(入力・出力)

あとは、writeheader()writerows() でCSVファイルに書き込みます。

以上でCSVとJSONの変換方法の解説を終わります。

・関連記事:PythonでCSVファイルを読み込み・書き込み
・関連記事:pandasでCSVファイルを読み込む方法(read_csv)
・関連記事:辞書