csv.writerの数字が変なところで分割された時の対処法。

2019年4月21日日曜日

t f B! P L
スポンサーリンク

csv.writerの書き込み時に,.(ドット)にて,数字が分割されるという謎の状態にハマりました.
例えば,2.0や3.0をcsv.writerで書き込みたい場合に,以下のような状態になりました.


その時のコードはこちらご覧の通り,2.0が3つのセルに分かれてしまいました.
                        # error_data[m][0] = 2.0とか3.0とかの数値をcsvファイル                           から読み取り,配列に入れている.
writer = csv.writer(f,lineterminator='')
                        writer.writerow(str(error_data[m][0]))
  
writer.writerow(error_data[m][0])がきもです.
何故か分かりませんが,文字列あるいは,変数としてwriter.writerowに書き込んでしまうと,2.0のような”.”つきの数値の書き込みがおかしくなります.
解決策としては,2つあります.
1つ目(これはあまりいい方法ではありません).
                           sss =  data[m][0],0
                           writer = csv.writer(f,lineterminator='')
                           writer.writerow(sss)

おかしい数値の部分でセルが別れてしまう場合は,変数に2つ以上の数値を代入しておけば,なおります.

上記のコードを書いた場合の出力.

どうでしょう.2.0が1つのセルに入ったでしょう?
ただ,0が邪魔です.
0使わねーし…

ということで,2つ目の方法.
writer.writerowの()内の記入方法を変える.
writer.writerow([error_data])のように,[]内に配列名を入れましょう.
そうすると,コンマでセルが別れるといったクソな状況を回避できます.

writer = csv.writer(f,lineterminator='')
writer.writerow([error_output[m],error_data[m][1],error_data[m][2]])
スポンサーリンク



ちなみに,私が書いたコードが上記です.
結果は,これ.

1つ目のセルだけ,どうして".0"が省略されるか分かりませんが,まあ,目的は達成できました.
上記のように,配列の中に更に配列を入れることによって,きれいに数値入れることが可能になります.
みなさんもやってみて下さい.

番外編

lineterminatorをいじって,セルの.分割を防ごうとしましたが,うまくいきませんでした.
writer.writerowに配列を入れる場合は,純粋に["配列[]"]のほうが良いのかなと思います.
ちなみに,この.で数値とセルが分割されてしまうというエラーを調べてみると,どこにもヒットせず…
自力で模索すること2日間…
pandasでためそうかなやんで1日間…
リストをnp.array()で配列化に変換してみてファイルに書き込むこと1日間…
時間にして,100時間はファイル書き込みに費やしました…

みなさんも,コンマでセルと数値が分割されてしまう場合は,上記のコードを参考にしてみて下さい.
スポンサーリンク

QooQ