回答:
ファイルをループして行を読み取ります。
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
ファイルオブジェクトは反復可能で、EOFまで行を生成します。ファイルオブジェクトをイテラブルとして使用すると、バッファーを使用して確実に読み取りを実行できます。
stdinでも同じことができます(使用する必要はありませんraw_input()
:
import sys
for line in sys.stdin:
do_something()
画像を完成させるために、バイナリ読み取りは次のように実行できます。
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
にchunk
は、ファイルから一度に最大1024バイトが含まれ、openfileobject.read(1024)
空のバイト文字列を返し始めると反復が停止します。
stdin
実行中のプロセスからを読み取っています...そのため、プロセスを強制終了するまで、EOFはありません。しかし、それから私は「これまでのところ」に達し、私は行き詰まります。デッドロックではなく、これをどのように検出しますか?新しい行がないかのように、ファイルの読み取りを停止します(EOFがない場合でも、私の場合は存在しません)。
PythonでCイディオムを模倣できます。
max_size
バイト数までのバッファーを読み取るには、次のようにします。
with open(filename, 'rb') as f:
while True:
buf = f.read(max_size)
if not buf:
break
process(buf)
または、テキストファイルを1行ずつ:
# warning -- not idiomatic Python! See below...
with open(filename, 'rb') as f:
while True:
line = f.readline()
if not line:
break
process(line)
eofテストwhile True / break
がないため、構成を使用する必要がありますPythonには、読み取りから返されたバイトが不足していること以外に。
Cでは、次のようになります。
while ((ch != '\n') && (ch != EOF)) {
// read the next ch and add to a buffer
// ..
}
ただし、Pythonではこれを使用できません。
while (line = f.readline()):
# syntax error
式では代入が許可されていないためPythonのでです(ただし、最近のバージョンのPythonは代入式を使用してこれを模倣できますが、以下を参照してください)。
これを行うことは、Pythonでは確かにより慣用的です。
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
更新: Python 3.8以降では、割り当て式も使用できます。
while line := f.readline():
process(line)
readline()
な方法には利点があるようです:キャッチなどのきめ細かなエラー処理UnicodeDecodeError
を実行できますが、慣用的なfor
反復では実行できません。
ファイルを開いて行ごとに読み取るためのPythonイディオムは次のとおりです。
with open('filename') as f:
for line in f:
do_something(line)
上記のコードの最後で、ファイルは自動的に閉じられます(with
構成はそれを処理します)。
最後に、line
末尾の改行が保持されることは注目に値します。これは、以下を使用して簡単に削除できます。
line = line.rstrip()
for line in f.readlines(): ...
ます。
以下のコードスニペットを使用して、ファイルの終わりまで、行ごとに読み取ることができます
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
上記の「Pythonの方法で実行する」ための提案がありますが、EOFに基づくロジックを実際に使用したい場合は、例外処理を使用する方法だと思います-
try:
line = raw_input()
... whatever needs to be done incase of no EOF ...
except EOFError:
... whatever needs to be done incase of EOF ...
例:
$ echo test | python -c "while True: print raw_input()"
test
Traceback (most recent call last):
File "<string>", line 1, in <module>
EOFError: EOF when reading a line
またはを押してCtrl-Zのraw_input()
プロンプト(Windowsの、Ctrl-ZLinuxの)
line
末尾には改行文字があります。