イテレータをやっぱり分かってなかった話
先日から何度か書いていたコード(昨日も)に次のような記述をしていたのですが、基本中の基本の間違いをおかしていました(^_^;)
下のように書いてたのですが
def jsonwriter(tFileName, tDict, digitize=True): """write tDict to tFile as json if digitize=True, digitizable values will be done. """ tFile = codecs.open(tFileName, "w", "utf-8") 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(): if not(digitize and bool(re.compile("^\d+(\.\d+)?\Z").match(v))): v = '\"' + v + '\"' tStr = comFlg + u'\"' + i + u'\":' + v tFile.write(tStr) comFlg = u"," tFile.write(u"}") tFile.write(u"\n]") tFile.close()
※印の箇所でenumerateを使っているんですがその前の変数名がdummyです。なぜdummyにしたかといえばその後のコード内で使わないからです。自分でも「使わない変数を定義しなきゃいけないなんてenumerate使いにくいわ」と思いつつ、その4行下で
tDict[line]
のようにtDictというリスト(tDictなのに辞書じゃなくて辞書のリスト・・・名前の付け方もおかしいですね汗)のlineというインデックスを使っています。ところが"tDict[line]"は"dummy"が指しているものそのものなんですよね。つまりここはそもそもenumerate()を使うべき場所じゃなかったです。下のように書くべきでした。
def jsonwriter(tFileName, tDict, digitize=True): """write tDict to tFile as json if digitize=True, digitizable values will be done. """ tFile = codecs.open(tFileName, "w", "utf-8") tFile.write(u"[\n") #先頭の[ outerComFlg = u"" #2行目以降に改行とコンマを書き込むフラグ for line in tDict: #そもそもenumerate()を使う必要がない tFile.write(outerComFlg + u" {") outerComFlg = u",\n" comFlg = u"" #行内の2要素目以降の先頭にコンマを書き込むフラグ for i, v in line.iteritems(): if not(digitize and bool(re.compile("^\d+(\.\d+)?\Z").match(v))): v = '\"' + v + '\"' tStr = comFlg + u'\"' + i + u'\":' + v tFile.write(tStr) comFlg = u"," tFile.write(u"}") tFile.write(u"\n]") tFile.close()
for文については理解していたつもりだったのに基本的ミスでした。