強火で進め

このブログではプログラム関連の記事を中心に書いてます。

テキストファイルを読み込む場合に改行に注意

テキストファイルを読み込む場合に気をつけないといけない改行についての解説をします。

今回読み込むテキストファイルの内容は以下となります。

test.txt

111
222
333
444

テキストファイルを読み込むプログラムは以下となります。

f = open('test.txt', 'r')
data1 = f.readline()
data2 = f.readline()
print '1:'+data1
print '2:'+data2

この場合、テキストファイルの改行がUNIXなどで主に使用されるLF(\n)であった場合には以下の様に data1 が 111 、data2 が 222 となります。

1:111

2:222

※readline()は改行も含めて読み込むのでそれぞれのデータの間に改行が入っています。

しかし、テキストファイルの改行が昔のMacの様にCR(\r)を改行として使われていた場合はPythonでは改行とみなされないために以下の様に意図しない結果になってしまいます。具体的にはCRが呼ばれたタイミングでカーソルが先頭に移動するため同じ行で何度も上書きされます。

【IDLEの出力結果】

1:111
222
333
444
2:

【ターミナルの出力結果】

44411
2:

対策としてテキストファイルの改行を事前にLF(\n)にするかまたはファイルを開くとき

f = open('test.txt', 'r')

のように指定するのではなく、以下の様に rU を指定して( U だけでもOK)ファイルを開きます。

f = open('test.txt', 'rU')

このような指定方法については以下のサイトに記述があります。

6 PEP 278: Universal Newline Support
http://www.python.org/doc/2.3.5/whatsnew/node7.html

※こちらサイトの記述を見るとバージョン2.3以降の機能であり、またコンパイルの設定次第ではこの機能を含めないPythonを作成できそうなので注意が必要そうですね。

この指定を行った場合は以下のすべての改行が改行であると判断された処理が行われます( readline() などで正しく1行づつ取得できる)。

改行 主に使用される環境
\n Linux
\r Mac
\r\n Windows