アメリエフのブログ

Amelieff Staff Blog

どんな改行コードでも・後

前回に引き続き改行コードの処理の話です。
今回はPerlPythonのなかでどう扱うか、コード例を挙げて説明します。

perlの例


行末の「¥n」はchompで取り除くことができます。それ以外は正規表現を使うと簡単と思います。
open IN,"file.txt" or die "$!";
while(my $line = <IN>>){
chomp($line);
$line =~ s/¥r$//g;
# 処理
}



Pythonの例


Pythonの場合少し注意が必要です。
下の?の方法だと、「¥n」を改行の目印にしている(「¥r」を改行コードだとみなしてくれない)ため、「¥r」で改行しているファイルを読み込んだとき、1行ずつ読み込むつもりが、ファイルすべてを1行であるかのように扱ってしまいます。
?
with open('file.txt', 'r') as f:
for line in f:
line = line.replace(('¥r' or '¥r¥n'), '¥n').rstrip('¥n')
# 処理


open関数の引数を 'r' ではなく 'rU'('U'だけでも可)に変えると、すべての改行コードに対応して、ちゃんと1行ずつ読み込んでくれます。
詳細はこちら(PEP 278 -- Universal Newline Support
首尾よく1行ずつ読み込んだあとは、replaceメソッドなどで「¥r」や「¥r¥n」を「¥n」に置き換えたり、rstripメソッドで右端から改行コードを取り除いたりします。
?
with open('file.txt', 'rU') as f:
for line in f:
line = line.replace(('¥r' or '¥r¥n'), '¥n').rstrip('¥n')
# 処理



スクリプトに入力するファイルにどんな改行コードが含まれているかわからないときは、全部の改行コードにあらかじめ対応しておくと、後々改行コードにまつわるトラブルに悩まされることがありません。
とhatさんに教えていただいたので、私も気を付けます!