web-dev-qa-db-ja.com

Pythonで改行を書き込むときは、キャリッジリターン '\ r'を記述しないでください

_carriage return = \r_および_line feed = \n_を考慮に入れると

_Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> '{:02x}'.format(ord('\n'))
'0a'
>>> '{:02x}'.format(ord('\r'))
'0d'
_

open('filename','w').write('text\n')を使用するときにキャリッジリターンを書き込まないようにする方法は?

インタラクティブモードでは、次のことができます。

_>>> open('filename','w').write('text\n')
5
>>> for c in open('filename','r').read():
...     print('{:02x}'.format(ord(c)))
...
74
65
78
74
0a
_

これは、改行のみが書き込まれたことを示しているため、5バイトの長さにする必要があります。

_-rw-r--r-- 1 djuric 197121        6 Jul 15 21:00 filename
                                  ^
_

実際には6バイトの長さです。これは「Windowsのもの」である可能性がありますが、たとえばNotepad ++でファイルを開き、[表示]> [記号を表示]> [すべての文字を表示]にすると、キャリッジリターンが表示されます。

Ctrl + Hを押し、拡張検索モードを使用して\ rを何も置き換えなかった後、改行だけが残ります。ファイルを保存した後、ファイルには改行のみが含まれ、ファイルの長さは5バイトです。

_-rw-r--r-- 1 djuric 197121    5 Jul 15 20:58 filename1
                              ^
_

では、なぜNotepad ++はキャリッジリターンなしで改行を保存できるのに、pythonはできないのですか?

9
Ubica

これを行うには、テキストファイルを開くときに''newlineパラメータに渡します。

f = open('test.txt', 'w', newline='')
f.write('Only LF\n')
f.write('CR + LF\r\n')
f.write('Only CR\r')
f.write('Nothing')
f.close()

docs で説明されているように:

newlineは、ユニバーサル改行モードの動作を制御します(テキストモードにのみ適用されます)。 None、 ''、 '\ n'、 '\ r'、および '\ r\n'にすることができます。これは次のように機能します。

  • ストリームから入力を読み取るときに、改行がNoneの場合、ユニバーサル改行モードが有効になります。入力の行は「\ n」、「\ r」、または「\ r\n」で終わることができ、これらは呼び出し元に返される前に「\ n」に変換されます。 ''の場合、ユニバーサル改行モードが有効になりますが、行末は変換されずに呼び出し元に返されます。他の有効な値がある場合は、入力行は指定された文字列でのみ終了し、行末は変換されずに呼び出し元に返されます。

  • ストリームに出力を書き込むときに、改行がNoneの場合、書き込まれた '\ n'文字はすべて、システムのデフォルトの行区切り文字os.linesepに変換されます。改行が ''または '\ n'の場合、変換は行われません。改行が他の有効な値のいずれかである場合、書き込まれた '\ n'文字はすべて指定された文字列に変換されます。

newlineのデフォルト値はNoneです。''を指定すると、Pythonに改行(\n)を書き込むように強制されます。または\r)翻訳せずに。

12
ƘɌỈSƬƠƑ