web-dev-qa-db-ja.com

Pythonでファイルの終わりに達すると、readlineはどのような値を返しますか?

クラシックループを使用できます

_file_in = open('suppliers.txt', 'r')
line = file_in.readline()

while line:
    line = file_in.readline()
_

pythonでファイルを1行ずつ読み取る。

しかし、ループが終了するとき、「line」にはどのような値がありますか? Python 3つのドキュメントのみを読む:

readline(size = -1)

ストリームから1行を読み取り、返します。サイズが指定されている場合、最大でサイズのバイトが読み取られます。

バイナリファイルの場合、行末記号は常にb '\ n'です。テキストファイルの場合、open()の改行引数を使用して、認識される行末記号を選択できます。

編集

私のバージョンのPython(3.6.1)では、ファイルをバイナリモードで開くと、help(file_in.readline)は次のようになります。

_readline(size=-1, /) method of _io.BufferedReader instance

    Read and return a line from the stream.

    If size is specified, at most size bytes will be read.

    The line terminator is always b'\n' for binary files; for text
    files, the newlines argument to open can be used to select the line
    terminator(s) recognized.
_

これは 上記で引用したドキュメント とまったく同じです。ただし、 Steve Barnes で示されているように、ファイルをテキストモードで開くと、役立つコメントが表示されます。 (おっと!私の側でコピーアンドペーストエラー)

チュートリアルから: https://docs.python.org/3.6/tutorial/inputoutput.html#methods-of-file-objects

f.readline()はファイルから1行を読み取ります。改行文字(_\n_)は文字列の最後に残され、ファイルが改行で終わっていない場合にのみファイルの最後の行で省略されます。これにより、戻り値が明確になります。 f.readline()が空の文字列を返す場合、ファイルの終わりに到達していますが、空白行は_'\n'_で表されます。これは、単一の改行のみを含む文字列です。

7
yinnonsanders

pythonコンソールでファイルを開き、f、次にそのreadlineメソッドでhelpを呼び出すと、正確に次のことがわかります。

>>> f = open('temp.txt', 'w')
>>> help(f.readline)
Help on built-in function readline:

readline(size=-1, /) method of _io.TextIOWrapper instance
    Read until newline or EOF.

    Returns an empty string if EOF is hit immediately.

各readlineは、現在の時点以降のファイルの残りの部分で動作するため、最終的にEOFに到達します。

rbではなくrを使用してファイルをバイナリモードで開くと、<class '_io.TextIOWrapper'>オブジェクトではなく<class '_io.BufferedReader'>オブジェクトが取得されることに注意してください。ヘルプメッセージが異なります:

Help on built-in function readline:

readline(size=-1, /) method of _io.BufferedReader instance
    Read and return a line from the stream.

    If size is specified, at most size bytes will be read.

    The line terminator is always b'\n' for binary files; for text
    files, the newlines argument to open can be used to select the line
    terminator(s) recognized.

そして、このメソッドがEOFに達すると、空の文字列ではなく、空のバイト配列b''を返します。

上記のすべてがWin10でpython 3.6でテストされたことに注意してください。

4
Steve Barnes

(Python 3)コンソールで質問のコードスニペットを実行すると、空の文字列が返されるか、ファイルをバイナリモードで開いている場合は空のBytesオブジェクトが返されます。

これはどこかに文書化されていますか?おそらくそれは一種の広いpython標準ですか?