Python: ユニバーサル改行モード(改行コードの自動変換)

「Pythonでファイルの読み書きを行う際に、 勝手に改行コードが変換されていて困っている」という方は この記事を読んでみてください。 勝手に変換されている理由は 「ユニバーサル改行モード」が有効になっているからです。

ユニバーサル改行モード

ユニバーサル改行モード」とは、 OSによる改行コードの違いに対応するために、 ファイルの読み書きをする時に Pythonが自動で改行コードを変換する仕組みのことです。

テキストファイルを扱う際に、 Python内部では「LF」を標準の改行コードとして扱っていますが、 WindowsやMac、Linuxなど各OSによって標準とする改行コードは 次表のように異なります。

OSと改行コード
OS改行コード
WindowsCRLF
macOS, Linux等LF
旧Mac OSCR

この違いを吸収するための仕組みがユニバーサル改行モードです。

自動変換で行っている事

具体的にユニバーサル改行モードが行っていることを説明すると、 ファイルの読み込み時に「CRLF」や「CR」がPythonの標準改行コードの「LF」 に自動的に変換されます。

一方、書き込み時には文字列内にある「LF」がWindowsの場合は「CRLF」、 旧Mac OSの場合は「CR」に変換されます。LinuxやmacOSの場合はそのまま 「LF」が出力されます。

newlineで指定

ユニバーサル改行モードはファイルのオープン時にopen()関数の引数 「newline」で指定できます。 デフォルトではユニバーサル改行モードは「有効」になっています。

ユニバーサル改行モードをオフにして、 改行コードを自動変換しないようにするには次のように「newline=""」を指定します。 「newline=''」でも構いません。

f = open("a.txt", "r", encoding="utf-8", newline="")

引数newlineに指定できる値は次の5つです。デフォルト値は「None」。

内容
Noneデフォルト、自動変換する
""自動変換しない。
"\r\n"自動変換しない。"\r\n"を行の分割単位とする
"\r"自動変換しない。"\r"を行の分割単位とする
"\n"自動変換しない。"\n"を行の分割単位とする
Python