Python: ユニバーサル改行モード(改行コードの自動変換)
「Pythonでファイルの読み書きを行う際に、 勝手に改行コードが変換されていて困っている」という方は この記事を読んでみてください。 勝手に変換されている理由は 「ユニバーサル改行モード」が有効になっているからです。
ユニバーサル改行モード
「ユニバーサル改行モード」とは、 OSによる改行コードの違いに対応するために、 ファイルの読み書きをする時に Pythonが自動で改行コードを変換する仕組みのことです。
テキストファイルを扱う際に、 Python内部では「LF」を標準の改行コードとして扱っていますが、 WindowsやMac、Linuxなど各OSによって標準とする改行コードは 次表のように異なります。
OS | 改行コード |
---|---|
Windows | CRLF |
macOS, Linux等 | LF |
旧Mac OS | CR |
この違いを吸収するための仕組みがユニバーサル改行モードです。
自動変換で行っている事
具体的にユニバーサル改行モードが行っていることを説明すると、 ファイルの読み込み時に「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"を行の分割単位とする |