【python】pythonにおける改行コードの取り扱いまとめ

pythonにおける改行コードの取り扱いをまとめました。

python 3.7.2
Windows

改行コードを読み込む

まず、いろんな改行コードのファイルを読み込んでみます。
CR/LF/CR+LFの改行コードに指定したテキストファイルを作成し、下記のようなソースコードを実行しました。

#coding:utf-8
import pathlib

file = pathlib.Path('example.txt')
with file.open(encoding='utf-8') as f:
    lines = f.readlines()
    for line in lines:
        contains_cr = "\r" in line
        contains_lf = "\n" in line
        contains_crlf = "\r\n" in line
        print(line + " : " + str(contains_cr) + " / " + str(contains_lf) + " / " + str(contains_crlf))

すると結果は、いずれも改行コードがLFとして読み込まれていることがわかりました

改行コードは読み込み時に統一される(そしてこの環境では改行コードはLF)ということが言えそうです。

改行コードを記述する

ソースコード上で改行コードを記述するには\nか\r\nを使います。
書き出しのことを考えると\nを使っておくのが無難そうです。
ソースコード上では\n、\r\nが改行コードとして認識されます。

#coding:utf-8

text = "1行目\n2行目\r\n3行目"  # \n、\r\nのどちらかを改行コードとして使う
print(text) 

ちなみに改行を含む文字列はこのように書くと綺麗に記述できます。

#coding:utf-8

text = "1行目\n"\
       "2行目\r\n"\
       "3行目" 

改行コードを削除・置換する

前節のように改行コードは\nだったり\r\nだったりしますが、削除や置換をする際にこれら両方を考慮するのは面倒です。
したがって改行コードをソースコード上で取り扱うには専用のメソッドを使います。

改行コードを削除するには次のようにsplitlines()を使用します。

#coding:utf-8

text = "1行目\n2行目\r\n3行目"  # どちらの改行コードでも対応可能

lines = text.splitlines()  # 行ごとに分割したリストにする
print("".join(lines))  # リストを結合して文字列にする

置き換える文字を定義すれば改行コードを特定の文字に置き換えることもできます。

print(",".join(lines))  # カンマに置き換え

また、末尾の改行コードを削除するだけならrstrip()が使えます。

#coding:utf-8

text = "1行目\n"

print(text.rstrip()) # 末尾の改行コードが削除される

改行コードを書きこむ

改行コード付きの文字列をファイルに書き込む際には、

  • ソースコードの文字列内の改行は\nで記述しておく
  • newline引数で改行コードを指定する

という手順を取れば改行コードを指定して書き込みが行えます。

#coding:utf-8

filepath = 'example.txt'

with open(filepath, 'w', newline="\r\n") as f:
    f.write("1行目\n"\
            "2行目\n"\
            "3行目")