open関数の仕様です。newline 引数を指定すると自動変換をOFFにできます。
自動変換を無効にするには?
open関数の引数に「newline=''」を指定します。with open('./crlf.txt', 'r', newline='') as file:
for line in file:
print(line)
newline 引数について
指定できる値は 「None, '', '\n', '\r', '\r\n'」 の5つで、その他の値はエラーが発生します。newline 引数を省略、または [None] を指定した場合
- 改行コードが '\n' に 自動変換されます。
- ファイル内の '\n', '\r', '\r\n' で行が分割されます。
'' を指定した場合
- 改行コードの自動変換はされません。
- ファイル内の '\n', '\r', '\r\n' で行が分割されます。
'\n', '\r', '\r\n' を指定した場合
- 改行コードの自動変換はされません。
- newline で指定した値で行が分割されます。
newline指定値 | 自動変換 | 行の分割単位 |
---|---|---|
省略 | '\n'に変換される | '\n', '\r', '\r\n' |
None | '\n'に変換される | '\n', '\r', '\r\n' |
'' | 自動変換なし | '\n', '\r', '\r\n' |
'\n' | 自動変換なし | '\n' |
'\r' | 自動変換なし | '\r' |
'\r\n' | 自動変換なし | '\r\n' |
上記以外 | エラー(ValueError: illegal newline value) |
例1 CRLF('\r\n')のテキストファイル
line1'\r\n'
line2'\r\n'
line3'\r\n'
-
newline未指定 または newline=None の場合
1行目 -> line1'\n'
2行目 -> line2'\n'
3行目 -> line3'\n'
-
newline='' の場合
1行目 -> line1'\r''\n'
2行目 -> line2'\r''\n'
3行目 -> line3'\r''\n'
-
newline='\n' の場合
1行目 -> line1'\r''\n'
2行目 -> line2'\r''\n'
3行目 -> line3'\r''\n'
-
newline='\r' の場合
1行目 -> line1'\r'
2行目 -> '\n'line2'\r'
3行目 -> '\n'line3'\r'
4行目 -> '\n'
-
newline='\r\n' の場合
1行目 -> line1'\r''\n'
2行目 -> line2'\r''\n'
3行目 -> line3'\r''\n'
例2 LF('\n')のテキストファイル
line1'\n'
line2'\n'
line3'\n'
-
newline未指定 または newline=None の場合
1行目 -> line1'\n'
2行目 -> line2'\n'
3行目 -> line3'\n'
-
newline='' の場合
1行目 -> line1'\n'
2行目 -> line2'\n'
3行目 -> line3'\n'
-
newline='\n' の場合
1行目 -> line1'\n'
2行目 -> line2'\n'
3行目 -> line3'\n'
-
newline='\r' の場合
1行目 -> line1'\n'line2'\n'line3'\n'
-
newline='\r\n' の場合
1行目 -> line1'\n'line2'\n'line3'\n'
検証環境
- Microsoft Windows 10 Pro Version 1809 OS Build 17763.973
- Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] on win32