同じ項目でたくさんのデータ作るのに、人手だとスプレッドシート(Excelとか)使ってCSVファイルにするのが楽です。
でも別のツールとかに渡す時、JSONファイルでないとだめ、ってことがあるので、そういう時に使うPythonスクリプトを作りました。
自分は、Pythonのunittestをデータ駆動形で実行させるのに、JSON形式のデータが必要でした。
Python unittest DDT > Example usage
利用の前提
OS : Windows
Python : v3.5.1
スペック
- 引数に指定したcsvファイルから、JSONファイルを作成し、Pythonスクリプトを実行したディレクトリに保存する
- CSVファイルの行ごとに、カンマ区切りのデータをリストにする
- 作成するJSONファイル名は、[CSVファイル名]_datapool.json
- ファイルのエンコードはCSV、JSONともにShift-JIS(CSVファイルがUTF-8だと動作しない。)
- CSVファイルのデータに日本語が入ってても大丈夫
- CSVファイルの一行目はヘッダ行として、JSONファイルのデータからは除外する(2行目のデータからJSONファイルに書き込まれる)
ソース
JSONファイルは、人が読みやすいレイアウトになるようインデントかけたりしてます。
日本語のコメント入れると、実行時にjson.dumpsの行でエンコードのエラーが発生したので入れてません。(自己解決できなかったので保留にしてます。LinuxとかMacだと全部UTF-8でエラー出ないのでは、と悶々。)
script.py
# -*- coding: utf-8 -*-
import csv
import json
import sys, os, codecs
argvs = sys.argv
for csv_file_path in argvs:
if csv_file_path == __file__:
continue
with codecs.open(csv_file_path, 'r', 'shift_jis') as f:
json_reader = csv.reader(f)
name, ext = os.path.splitext(os.path.basename(csv_file_path))
with codecs.open(name + '_datapool.json', 'w', 'shift_jis') as json_file:
out = json.dumps([line_json for i, line_json in enumerate(json_reader) if i > 0] ,ensure_ascii=False, indent=4, sort_keys=False, separators=(',', ': '))
json_file.write(out)
使い方
上記のスクリプトファイルを、引数にcsvファイルを指定して実行します。(複数指定可)
>python script.py csv_file1.csv
作られるJSONファイル例は以下。
csv_file1_datapool.json
[
[
"テスト1",
"テスト2"
],
[
"てすと1",
"てすと2"
]
]
参考
引数でファイル名取得する
Python: コマンドライン引数の取得 – sys.argv変数エンコード指定して、ファイルを読み書きする
Python入門から応用までの学習サイト - ファイル読み書き