web-dev-qa-db-ja.com

os.linesepとは何ですか?

Pythonのosモジュールには、文字列を区切るプラットフォーム固有の行の値が含まれていますが、ドキュメントでは、ファイルへの書き込み時にそれを使用しないように明示的に述べています。

テキストモード(デフォルト)で開かれたファイルを書き込むときに、行終端記号としてos.linesepを使用しないでください。代わりに、すべてのプラットフォームで単一の「\ n」を使用します。

ドキュメント

前の質問 なぜあなたはなぜこの文脈でそれを使うべきではないかを探求しましたが、それからどんな文脈に役立つでしょうか?いつラインセパレータを使用する必要がありますか?

21
SuperBiasedMan

ドキュメントは、ファイルへの書き込み時に使用しないことを明示的に述べています

これは正確ではありません。ドキュメントではtextモードで使用しないように指示されています。

os.linesepは、テキストファイルの行を繰り返し処理する場合に使用されます。内部スキャナーはos.linesepを認識し、単一の「\ n」に置き換えます。

説明のために、「\ r\n」(Windows区切り文字)で区切られた3行を含むバイナリファイルを記述します。

import io

filename = "text.txt"

content = b'line1\r\nline2\r\nline3'
with io.open(filename, mode="wb") as fd:
    fd.write(content)

バイナリファイルの内容は次のとおりです。

with io.open(filename, mode="rb") as fd:
    for line in fd:
        print(repr(line))

NB:「rb」モードを使用して、ファイルをバイナリファイルとして読み取りました。

私は得る:

b'line1\r\n'
b'line2\r\n'
b'line3'

次のように、テキストモードを使用してファイルのコンテンツを読み取る場合:

with io.open(filename, mode="r", encoding="ascii") as fd:
    for line in fd:
        print(repr(line))

私は得る:

'line1\n'
'line2\n'
'line3'

区切り文字は「\ n」に置き換えられます。

os.linesepは書き込みモードでも使用されます。すべての「\ n」文字はシステムのデフォルトの行区切り文字に変換されます:Windowsでは「\ r\n」、POSIXでは「\ n」など。

io.open関数を使用すると、行区切り記号を任意に強制できます。

例:Windowsテキストファイルの書き方:

with io.open(filename, mode="w", encoding="ascii", newline="\r\n") as fd:
    fd.write("one\ntwo\nthree\n")

このようなテキストモードでこのファイルを読む場合:

with io.open(filename, mode="rb") as fd:
    content = fd.read()
    print(repr(content))

あなたが得る:

b'one\r\ntwo\r\nthree\r\n'
13
Laurent LAPORTE

ご存知のように、テキストモードでのファイルの読み書きは、pythonでプラットフォーム固有の行区切り文字を '\ n'に、またはその逆に変換します。ただし、バイナリモードでファイルを読み込む場合、変換なしその後、string.replace(os.linesep, '\n')を使用して行末を明示的に変換できます。これは、ファイル(またはストリームなど)にバイナリデータとテキストデータの組み合わせが含まれている場合に役立ちます。

6
Rob