1. ホーム
  2. python

[解決済み] os.lineepは何のためにあるのですか?

2022-02-24 03:48:54

質問

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

テキストモードで開かれたファイルを書き込む場合(デフォルト)、行の終端として os.linesep を使用しないでください。

ドキュメント

過去の質問 は、なぜあなたが しないほうがいい をこの文脈で使うことはできますが、では、どのような文脈で役に立つのでしょうか?どんなときに、何のために、ラインセパレーターを使うべきなのでしょうか?

どのように解決するのですか?

<ブロッククオート

ドキュメントによると、ファイルへの書き込み時に使用しないように明示されています。

これは正確ではありません。 テキスト モードを使用します。

は、その os.linesep は、テキストファイルの行を繰り返し処理する場合に使用します。内部スキャナは os.linesep という文字列が表示され、それを1つの" \n"に置き換えます。

例として、Windowsのデリミタである" \rn" で区切られた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'

デリミタが"Ⅻに置き換わります。

os.linesep Windowsでは" \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'