2015.11.02   |   Python

CSVからJSONに変換をPythonでやってみる

CSVは厳密な仕様が決められていないのでエスケープや改行の扱いに難がありますが、ExcelやSpreadsheetsから変換できるので非エンジニアとやり取りするには便利なフォーマットです。

ただプログラムで扱うにはカンマ区切りを配列に直し、ラベルの位置と対応付けて操作しなければならないのでちょっと面倒です。プログラムで扱うためにはJSONとかの方がお手軽です。

そこで今回はCSVからJSONを作るスクリプトをPythonで書いてみました。

やりたいこと

AAA,BBB,CCC
123,456,789
111,222,333

今回はこんな形のCSV(カンマ区切りのテキストファイル)を考えてみます。1行めが列のラベルで、2行目以降が実際の値が入っているようなファイルです。

[
    '{"AAA": "123", "BBB": "456", "CCC": "789"}', 
    '{"AAA": "111", "BBB": "222", "CCC": "333"}'
]

CSVをこんな感じでJSONに変換するのが今回のゴールです。全体の配列の中に1行1オブジェクトが入っており、各オブジェクトはラベルと値が対応付けられています。ラベルが各行に入っているのでデータサイズとしては大きくなってしまいますが、プログラムで扱うには便利な形式になります。

実装

# coding: utf-8
import csv, json
print([json.dumps(l) for l in csv.DictReader(open('hoge.csv'))])

なんと3行で書けます。Python便利ですね。

import csv
import json

result = []

with open('hoge.csv') as f:    
    for line in csv.DictReader(f):
        line_json = json.dumps(line)
        result.append(line_json)
print(result)

もうちょっと丁寧に書くとこんな感じ。
Python標準のcsvモジュールがCSVのパースやラベル行との対応付けを面倒見てくれるので、こちらがやることはほとんど無いです。1行づつJSONにして全体の配列に入れて出力するだけ。

一つ問題があるとするならCSVが大きすぎる場合メモリを使いきってしまうことですね。result配列にJSON化したデータを入れていくのでやたら行が大きい場合はメモリを使いきってしまう可能性が無くはないです。そういう場合はresultみたいな変数を使わず、1行づつ標準出力なりファイルなりに書きだしていくように書きなおせば大丈夫です。JSONとして書き出すには全体を覆う「[]」と、最後の行以外に「,」も合わせて出力する必要があるのでちょっと複雑ですが。