JSON出力部分を無理矢理書いてみた

昨日JSONライブラリを読んで改造しようかなと言ったばかりなのですが、私のスキルでは他人が書いたコードを読むのは自分で新たに書くより難度が高いと分かったので諦めて自作してみました。

書き込む関数以外は省略しています。(全体はエントリの最後に)

def jsonwriter(tFile=jsonFile, tDict=eachDict):
    """write tDict to tFile as json"""
    
    tFile.write(u"[\n") #先頭の[
    
    outerComFlg = u"" #2行目以降に改行とコンマを書き込むフラグ
    
    for line, dummy in enumerate(tDict):
        tFile.write(outerComFlg + u" {")
        
        outerComFlg = u",\n"
        
        comFlg = u"" #行内の2要素目以降の先頭にコンマを書き込むフラグ
        
        for i, v in tDict[line].iteritems():
            tStr = comFlg + u'\"' + i + u'\":\"' + v + u'\"'
            
            tFile.write(tStr)
            
            comFlg = u","
        
        tFile.write(u"}")
    
    tFile.write(u"\n]")

jsonwriterという名前ですが全く汎用性はなくここでしか使えません。ただこれで一応

ID,name,text
0,ナツ,どうも
1,アキ,こんにちは

というCSV

[
 {"ID":"0","name":"ナツ","text":"どうも"},
 {"ID":"1","name":"アキ","text":"こんにちは"}
]

という形のjsonファイルに変換できるようにはなりました。めんどくさいのは各項と行の区切りの","ですね。すべての行と項目の終わりに入れるのであれば簡単(下のような形)なのですが、各行の最終項の後ろと最終行の後ろにはいれないでおきたいのでそのためのフラグを無理矢理いれました。

こういう形ならもっと簡単に書ける
[
 {"ID":"0","name":"ナツ","text":"どうも",},
 {"ID":"1","name":"アキ","text":"こんにちは",},
]

うーん、もうちょっと「うまく」書きたいところです(^_^;)

コード全体

# coding: shift_jis
#CSVを読み込んでJSON化する

import sys
import codecs
from collections import OrderedDict


if sys.argv[1].endswith(".csv"):
    csvFileName = sys.argv[1]
else:
    csvFileName = sys.argv[1] + ".csv"

#読み出しで開く
csvFile = open(csvFileName, 'r')

#行のリストを作成
eachLine = []

for line in csvFile:
    eachLine.append(line.replace("\n", "")
                    .replace('\"', '')
                    .replace("\'", ""))

csvFile.close()

eachPart = [""] * len(eachLine)

#各行をカンマで分割
for i, v in enumerate(eachLine):
    eachPart[i] = v.split(',')

#キーのリスト
keyList = eachPart.pop(0)

#dictのリストを作る
eachDict = [""] * len(eachPart)

for i, v in enumerate(eachPart):
    eachDict[i] = OrderedDict()

    if len(keyList) != len(eachPart[i]):
        print "Item #" + str(i) + " length adjust"

    #キーの長さより要素数が少ない場合は""で埋める
    if len(keyList) > len(eachPart[i]):
        gap = len(keyList) - len(eachPart[i])
        eachPart[i].extend(gap * [""])

    for j, vj in enumerate(keyList):
        eachDict[i][vj] = unicode((eachPart[i][j]), "shift_jis")

#書きこむファイル作製
jsonFileName = csvFileName.replace('.csv', '.json')

jsonFile = codecs.open(jsonFileName, "w", "utf-8")

#JSON出力
def jsonwriter(tFile=jsonFile, tDict=eachDict):
    """write tDict to tFile as json"""
    
    tFile.write(u"[\n") #先頭の[
    
    outerComFlg = u"" #2行目以降に改行とコンマを書き込むフラグ
    
    for line, dummy in enumerate(tDict):
        tFile.write(outerComFlg + u" {")
        
        outerComFlg = u",\n"
        
        comFlg = u"" #行内の2要素目以降の先頭にコンマを書き込むフラグ
        
        for i, v in tDict[line].iteritems():
            tStr = comFlg + u'\"' + i + u'\":\"' + v + u'\"'
            
            tFile.write(tStr)
            
            comFlg = u","
        
        tFile.write(u"}")
    
    tFile.write(u"\n]")
        

jsonwriter()

jsonFile.close()