CSVをJSONに変換して出力する方法、JSONからCSVに変換する方法について解説します。
使用ライブラリ
インストール:不要
インストール:不要
CSVファイルをJSONに変換してファイル出力
日時・温度・湿度データが記録されているCSVファイル(sensor.csv)を、JSONに変換してファイルを出力するサンプルです。
sensor.csv の中身は以下のようなカンマ区切りのデータになります。
これをJSON {“key” : “value”} 形式に変換します。
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,温湿度
1 2 3 4 5 6 7 8 9 10 11 12 | # ライブラリ設定 import csv import json # CSVファイルの読み込み with open('sensor.csv', 'r') as f: d_reader = csv.DictReader(f) d_list = [row for row in d_reader] # JSONファイルへの書き込み with open('output.json', 'w', ensure_ascii=False) as f: json.dump(d_list, f) |
output.jsonの出力結果は以下のようになります。
プログラム解説
プログラムを解説します。
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: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’:’温湿度’}]
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に変換して文字列を出力するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 | import json import csv # CSVファイルの読み込み with open('sensor.csv', 'r') as f: dreader = csv.DictReader(f) d_list = [row for row in dreader] # 文字列として出力 json_text = json.dumps(d_list, ensure_ascii=False) print(json_text) |
出力結果は以下のようになります。
プログラム解説
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ファイルに変換して出力するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import csv import json # JSONファイルのロード with open('output.json', 'r') as f: json_dict = json.load(f) # 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) |
以下のようなCSVファイルが出力されます。
“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″,”温湿度”
プログラム解説
with open(‘output.json’, ‘r’) as f:
json_dict = json.load(f)
open()
関数で JSON ファイルを読み取りモードで開き、json.load()
でJSON文字列を辞書に変換します。
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)
・関連記事:辞書