を「EOFないが」、私は常にEOFまでデータを読み取るために、次のスニペットを使用するためのPythonで完璧な対応は何か:私は、このようにCやPascalで、いくつかのテキストファイルを読むには
while not eof do begin
readline(a);
do_something;
end;
私はこれをPythonでシンプルかつ高速にどのように行うことができますか?行読み込むファイルオーバー
を「EOFないが」、私は常にEOFまでデータを読み取るために、次のスニペットを使用するためのPythonで完璧な対応は何か:私は、このようにCやPascalで、いくつかのテキストファイルを読むには
while not eof do begin
readline(a);
do_something;
end;
私はこれをPythonでシンプルかつ高速にどのように行うことができますか?行読み込むファイルオーバー
ループ:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
ファイルオブジェクトはEOFになるまで反復可能と歩留まりのラインです。ファイルオブジェクトをイテレートとして使用すると、バッファを使用してパフォーマンスの読み込みが確実に行われます。
あなたは、標準入力(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), ''):
do_something()
chunk
がアップが含まれます
ファイルから一度に1,024バイトまで
ファイルを開いて行単位で読むためのPythonイディオムは、
01です。with open('filename') as f:
for line in f:
do_something(line)
ファイルは、上記のコードの最後に自動的に閉じられます(with
構造がそれを処理します)。
最後に、line
が末尾の改行を保持することは注目に値する。これは次のように簡単に削除できます。
line = line.rstrip()
+1、これはOPにも指摘されています。これは、一般的に示唆されている解決策である、f.readlines()の行と非常によく似ていません。 – jedwards
PythonでCイディオムを模倣することはできます。
with open(filename,'rb') as f:
while True:
buf=f.read(max_size)
if not buf: break
process(buf)
または、テキストファイルの行ラインで:
バイトのmax_size
数までバッファを読み取るには、あなたがこれを行うことができます
# warning -- not idiomatic Python! See below...
with open(filename,'rb') as f:
while True:
line=f.readline()
if not line: break
process(line)
をあなたは以来while True/break
構文を使用する必要がありますPythonではno eof testが読み込みから返されたバイト数以外にあります。
Cでは、あなたが持つかもしれない:
while ((ch != '\n') && (ch != EOF)){
// read the next ch and add to a buffer
// ..
}
をしかし、あなたはPythonでこれを持つことはできません。
while(line=f.readline()):
# syntax error
Pythonでassignments are not allowed in expressionsので。
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
あなたは、ファイルの終わりまで、行ずつを読み取るためのコードスニペットの下に使用することができます
もちろん、行を返さない*はありません。 –
@MartijnPieters:今それは:-) – dawg
CとPerlのプログラマーとして、** [代入は式では許されません](http://docs.python.org/2/faq/design.html#なぜ表現が可能なのですか?)**は私にとって非常に重要でした。 –
が
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
IMO、これは尋ねられたことを最もよく反映する1つの答えです。 – gvrocha
あなたが使用することができます:Pythonはこれを実行するに
は、それは確かにより慣用であります次のコードスニペット。 readlines()は一度にファイル全体を読み込み、行単位で分割します。
line = obj.readlines()
「それをPythonの道をやって」のための上記の提案は1つが本当に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
それともraw_input()
プロンプト(WindowsのではCtrl-Zを押して、はCtrl-Z Linux)
@TessellatingHecklerは、[ドキュメンテーション](https://docs.python.org/2/library/exceptions.html#exceptions.EOFError)とは異なります: "組み込み関数の1つ(input )またはraw_input())は、データを読み取ることなくファイルの終わりの条件(EOF)にヒットします。 –
@ TadhgMcDonald-Jensenうーん、そうだよ。どのように奇妙です。偽のクレームが引っ込められ、不公平なダウンワードが削除されました。 – TessellatingHeckler
ありがとう、BTW、私はこれをraw_input()、すなわちstd入力に対してどうやって行うことができますか? –
これを行うには 'sys.stdin'を使う必要があります – jozefg
" sys.stdin "の部分が本当に助けてくれてありがとうございます。 –