JSON出力部分を改善しました
先日のエントリでCSV→JSON変換プログラムのJSON出力部分を完成しました、と書いたのですがコメントで改善できる点についてご教示頂いたので書きなおしました。
処理面での改良点は2つで正規表現オブジェクトを作成する場所とcontinue文の追加です。
def jsonwriter(tFileName, tDict, digitize=True, ignore0=True, ignoreBlank=True, blankToNull=True): """write tDict to tFile as json. if digitize=True, digitizable values will be done. if digitize and ignore0 are both True, 0-value property is not written. if ignoreBlank=True, blank string ("") is not written. if ignoreBlank=False and blankToNull=True, blank string is written as null. """ tFile = codecs.open(tFileName, "w", "utf-8") digitCheck = re.compile("^\d+(\.\d+)?\Z") #float型に変換可能かどうかを判断する正規表現をあらかじめ定義 tFile.write(u"[\n") #先頭の[ outerComFlg = u"" #2行目以降に改行とコンマを書き込むフラグ for line in tDict: tFile.write(outerComFlg + u" {") outerComFlg = u",\n" comFlg = u"" #行内の2要素目以降の先頭にコンマを書き込むフラグ for i, v in line.iteritems(): if digitize and digitCheck.match(v): if ignore0 and float(v) == 0: continue else: if ignoreBlank and v == "": continue elif blankToNull and v == "": v = "null" else: v = '"' + v + '"' tStr = comFlg + u'"' + i + u'":' + v tFile.write(tStr) comFlg = u"," tFile.write(u"}") tFile.write(u"\n]") tFile.close()
従来はfor文の中で"re.compile("^\d+(\.\d+)?\Z")"と記述していたため、ループ毎にオブジェクトを作成していましたが、for文に入る前にオブジェクトを作成し、ループ内では毎回それを使用するように変更しました。
また私はそもそもcontinue文というのを知らなかった(Javascriptにもあるのですが知らなかったです)ので書き出さないプロパティを判別するためにフラグとなる変数を用意していたのですが、continue文を使えばよりスマートに書けますね。
他に文字列のエスケープも勘違いしていたものを改善しました。
ループ内での条件分岐も改善できる余地があるなーと思っているのですがネストが深くなってしまうしどっちがいいのか考え中・・・。