6.04.2013

pythonにおける改行コード、改めて調べてまとめてみた。多分pythonだけじゃないけど。




ごく初歩的な話なんだけど、改行コードの整理が自分の中でついていなかった。
それなのにmacやwindowsやメモ帳やNoEditorなどなどで、整理せずにツールを作っていたので、いろいろ改行コードまわりで不具合が発生した。



知っている人にとっては当たり前の話なんだろうけど、僕みたいに知ったかぶりをしていた人や、知らない人にとっては、少し役立つ情報かもしれないからとりあえずまとめておこうと思う。

まず、改行コードっていうのはPCやワープロなんかで改行を表す制御文字のことなんだけど、(wiki) 大きく3種類ある。
・CR(キャリッジリターン)
・LF(ラインフィード)
・CR+LF

3種類あるだけならいいんだけど、厄介なのはシステムやOSによって使っている改行コードが違うというところにある。ざっくり分けると以下の通り。

・OS9以前みたいな昔のMac : CR
・UNIX系、MacOSX、Linux : LF
Windows、MS-DOS : CR+LF

だから、これらをしっかり理解して、今現時点でテキストファイルなり、stdoutなりで記述されている改行コードが何で、もし改行コードをstripする必要があるとすれば、どの改行コードをstripしなければならないかをちゃんと把握しておく必要がある。

pythonにおいては、改行コードを文字列として表すのだけど、それぞれ
・CR : '¥r'
・LF : '¥n'
・CR+LF : '¥r¥n'
こういう表現となる。

基本的にはwindowsユーザをターゲットにしている場合は、CR+LF('¥r¥n')でテキストファイルがくると思って考えればいいと思うんだけど、一応他の改行コードがくっついてきたテキストをreadlineしてしまったときのために、.replace関数を使ってあげるといいと思う。

host.readline().replace(('¥r'or'¥n'),'¥r¥n')
(hostは適当なファイルとか)

これを書いてあげると、CRあるいはLFの改行コードはCR+LFに変換してくれる。今のところ何度か試したけど、最初からCR+LFの場合は、スルーしてくれるっぽい。

あと、めんどくさいのが、print >>とかstdoutで、出力先をかえたりすると、基本的に改行コードはLF('¥n')が付加されることになる。それで出力したログをNoeditorみたいな、いい具合に読んでくれるテキストエディタでみていたりすると、実際にメモ帳で開いたときに改行コードが認識されなくて、ひとつながりのテキストってことになってしまう。

だからprint >>なんかで書き出すときには、CR+LFを付加してから、わざわざLFをstripしてあげるのがいいと思う。最後にLFをstripするのはLF自体が自動で付加されてしまうからで、必ず最後につくからというのは言わずもがな。

print >> host.txt , 'host.txtに書き込みを行います' + '¥r^n'.rstrip('¥n')

基本中の基本なんだろうけど、ちゃんと理解して意識してないとダメだな。
特にクロスプラットフォームで作業するってなると、マストですね。

というわけで、というか、という言い訳で、まだコンパイルできてないって言う。
PDCAまわして再発防止やって、ってもう趣味じゃないなー。




0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...