#csv形式からjson形式へ
知り合いのおじさんが経営する学習塾で使用する英単語テスト作成システムの新調のため,csv形式で保存されていた単語のデータをjson形式に変換する必要がありました.
備忘録として初投稿しようと思います.
Pythonで変換
探せばフリーソフトなど見つかりそうでしたが,最近利用しているPandasの復習も兼ねてPythonで変換しました.
利用したモジュール
- json
- pandas
- argparse
csv形式のファイルの仕様
1行目に乱数,2行目に単語,3行目に意味が入力されています.
乱数はテスト作成でランダムに出題できるよう,マクロで並び替えを行う際に使用します.新しい環境では利用しないため削除します.
random num, name, mean
0.93837248,apple,りんご
...
...
json形式のファイルの仕様
システム自体を製作したのは別の方なので,実際の仕様ではありませんが以下のようにします.
[
{
"name": "単語",
"mean": "単語の意味",
"id": "一意に設定する文字列",
"rank": "習熟度を表す数値(int)",
},
]
ソースコード
あれこれ書く前に結果だけ載せておきます.
細かい部分は変更しておりますが,おおまかな雰囲気はこんな感じです.
import json
import argparse
import pandas as pd
def csv_to_json(src_file, dst_file):
if dst_file:
dst_file = dst_file
else:
dst_file = 'tmp.json'
df = pd.read_csv(src_file)
df['id'] = [None for _ in range(len(df.index))]
df['rank'] = [0 for _ in range(len(df.index))]
df.to_json(dst_file, force_ascii=False, orient='records')
with open(dst_file, 'r', encoding='utf-8') as f:
json_out = json.load(f)
with open(dst_file, 'w', encoding='utf-8') as f:
json.dump(json_out, f, ensure_ascii = False, indent = 4, separators = (',', ': '))
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# add argument: csv file name
parser.add_argument('src', help='source csv file name')
parser.add_argument('--dst', help='destination json file name')
# analysis arguments
args = parser.parse_args()
csv_to_json(args.src, args.dst)
利用する際はこんな感じ.
$ python3 csv_to_json.py word_db.csv
この場合tmp.json
というjson形式のファイルが作成されます.
ファイル名を指定したい場合は以下の通り.
$ python3 csv_to_json.py word_db.csv --dst (指定したいファイル名).json
2度も書き込んでいる理由
最初はリストを用いて適当に変換してしまおうと思っていましたが,列の追加・削除やデータの形式を保った状態での書き込みが面倒だったので,pandasを用いることにしました.
その際データの整形がうまくいかず1行で出力されてしまったので,なんとなく見栄えがいいと思い2回目に整形してDumpしています.
以上.
今後複数の単語データを変換する可能性があったため,コンソールによるファイル名の設定を行えるようにできたのは嬉しい!
Pythonペーペーですが楽しくて時間を忘れますね〜
初投稿で至らない部分も多くあると思いますので,改善点やご指摘お待ちしています.