Why it doesn't work?

作業のメモ、記録をブログに残しています。

Python ファイルを'rU' (universal newlines)モードで読み込む

pythonでGeoJSONファイルを出力する で作成したツールで、テストをしていてあることに気がつきました。

出力されたデータの出力数が異常に少ない時があるのです。
オリジナルのログのGPSデータを10とすると出力されたGeoJSONデータは1ないし2程度です。

for line in f:

にログを追加してみると、想定以上に早い段階(行数)でfor文を抜けていることがわかりました。
試しに、readline()を使用しても駄目でした。
処理を抜けてしまう行を調べると、ログの一部が文字化けしており、文字化け部分に0x1aが含まれてました。
0x1aはEOF。。。
readline()の説明と照らし合わせると。。。

ファイルから一行全部を読み込みます。行末の改行文字は文字列に残ります (だだし、ファイルが不完全な行で終わっていたら、存在しないかもしれません)。 [6] size 引数が与えられ、負でなければ、それが (行末の改行文字を含む) 最大バイト数となり、不完全な行でも返されます。 size が 0 でなければ、空の文字列が返されるのは、即座に EOF に到達したとき だけ です。

どうも、これに引っかかっていたようです。

これをどう解決すべきか調べていたところ、openのモードのオプションに'U'があるのに気がつきました。

標準の fopen() における mode の値に加えて、 'U' または 'rU' を使うことができます。Python が universal newlines サポートを行っている (標準ではしています) 場合、ファイルがテキストファイルで開かれますが、行末文字として Unix における慣行である '\n' 、Macintosh における慣行である '\r' 、 Windows における慣行である '\r\n' のいずれを使うこともできます。

universal newlinesとは、

テキストストリームの解釈法の一つで、以下のすべてを行末と認識します: Unix の行末規定 '\n'、Windows の規定 '\r\n'、古い Macintosh の規定 '\r'。利用法について詳しくは、 PEP 278 と PEP 3116 、さらに str.splitlines() も参照してください。

これを、 '\n'、'\r\n'、'\r'以外は改行として扱われないのかな?と都合よく解釈して以下のような修正を行ってみました。

with open(arg, 'rU') as f:


結論から言うと、いまのところ期待通りの動作をしてくれています。ただ、不具合箇所の調査、およびpythonの改行の定義(universal newlinesを指定した時と通常じの違い)についてなど、もう少し調べてから結論を出したと思います。
今日はここまで。