初Pythonプログラム csvをjsonに変換
Pythonについて一通り基本部分は勉強したはずなのでとりあえず何か作ってみようと思いました。
私はこれまでJavascriptしか勉強したことがなかったので(はるか昔Cを勉強しましたがすでに忘れてしまいました)、ファイルの入出力を扱ったことがほとんどありません。
そこでCSVファイルを読み込みJSONファイルに変換して出力するプログラムを作ってみることにしました。
まずcsvファイルを読み込み一行目の各要素をキー、2行目以降の要素を値とするオブジェクトの配列に変換することにします。
name,age,sex 男の子,20,male 女性,25,female
が
[{"name": "男の子", "age": "20", "sex": "male"}, {"name": "女性", "age": "25", "sex": "female"}]
という風になることを目指します。
仕組みはcsvファイル全体を2次元リスト化してから辞書のリストを作製し、それをjsonモジュールを使って出力することにします。
そして数時間の試行錯誤の末に書いたのがこれです。
# coding: shift_jis #CSVを読み込んでJSON化する import json import codecs csvFileName = "test.csv" #読み出しで開く csvFile = open(csvFileName,'r') #行のリストを作成 eachLine = [] for line in csvFile: eachLine.append(line) #ファイル閉じる csvFile.close() eachPart = [""] * len(eachLine) #各行をカンマで分割 for i in range(len(eachLine)): eachPart[i] = eachLine[i].split(',') #キーのリスト keyList = eachPart.pop(0) #辞書のリストを作る eachDict = [""] * len(eachPart) for i in range(len(eachPart)): eachDict[i] = {} for j in range(len(keyList)): eachDict[i][keyList[j]] = unicode(eachPart[i][j] , "shift_jis") #書きこむファイル作製 jsonFile = codecs.open("test.json","w","utf-8") #JSON出力 json.dump(eachDict, jsonFile, sort_keys=False, ensure_ascii=False)
実行結果は
[{"age": "20", "name": "男の子", "sex\n": "male\n"}, {"age": "25", "name": "女性", "sex\n": "female"}]
改行コード除去するの忘れてた・・・。
入力がシフトJISにしか対応していないのですが、とりあえずそこは仕様ということにします。
当初csvモジュールを使おうと思ったのですがカンマで区切るだけならあまりメリットが感じられなかったのでsplit(',')で切っています。
for i in range(len(LIST))
という書き方をやたら多用しているのはJavascriptの
for(var i = 0; i < array.length; i++){}
という書き方のクセでそのやり方しか浮かばなかったからです(^_^;)
(1/30追記、これはPythonではenumerate()を使うのが普通のようです。)
同様にクセでつい
list = [] list[0] = "hoge"
と、やりたくなってしまいます。おそらくリストの初期化のやり方がおかしいとは思いますがこれから勉強したいと思います。
一番悩んだのが出力ファイルの文字化けで"json.dump"の"ensure_ascii=False"と書けばとりあえず正しく出力できることは分かったけれど意味はよく分かっていません。
あと何も指定がない場合辞書はkeyがソートされてしまうようです。元の順番を維持するようにしたいところです。
以上がこのコードの主な内容と課題です。
しばらくはこのコードを改変しつつ勉強して生きたいと思います。