30

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

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

ドキュメント

前の質問では、このコンテキストで使用すべきではない理由を探りましたが、それではどのようなコンテキストに役立つのでしょうか? 行区切り記号はいつ、何のために使用する必要がありますか?

4

2 に答える 2

19

ドキュメントは、ファイルへの書き込み時にそれを使用しないように明示的に言っています

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

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))

注意: 「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'
于 2016-06-28T12:06:10.823 に答える
7

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

于 2016-06-28T11:39:23.667 に答える