2013-03-24 8 views
68

を「EOFないが」、私は常にEOFまでデータを読み取るために、次のスニペットを使用するためのPythonで完璧な対応は何か:私は、このようにCやPascalで、いくつかのテキストファイルを読むには

while not eof do begin 
    readline(a); 
    do_something; 
end; 

私はこれをPythonでシンプルかつ高速にどのように行うことができますか?行読み込むファイルオーバー

答えて

128

ループ:

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バイトまで

+1

ありがとう、BTW、私はこれをraw_input()、すなわちstd入力に対してどうやって行うことができますか? –

+1

これを行うには 'sys.stdin'を使う必要があります – jozefg

+1

" sys.stdin "の部分が本当に助けてくれてありがとうございます。 –

15

ファイルを開いて行単位で読むためのPythonイディオムは、

01です。
with open('filename') as f: 
    for line in f: 
     do_something(line) 

ファイルは、上記のコードの最後に自動的に閉じられます(with構造がそれを処理します)。

最後に、lineが末尾の改行を保持することは注目に値する。これは次のように簡単に削除できます。

line = line.rstrip() 
+1

+1、これはOPにも指摘されています。これは、一般的に示唆されている解決策である、f.readlines()の行と非常によく似ていません。 – jedwards

40

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) 
あなたは、ファイルの終わりまで、行ずつを読み取るためのコードスニペットの下に使用することができます
+0

もちろん、行を返さない*はありません。 –

+0

@MartijnPieters:今それは:-) – dawg

+3

CとPerlのプログラマーとして、** [代入は式では許されません](http://docs.python.org/2/faq/design.html#なぜ表現が可能なのですか?)**は私にとって非常に重要でした。 –

3

line = obj.readline() 
while(line != ''): 

    # Do Something 

    line = obj.readline() 
+1

IMO、これは尋ねられたことを最もよく反映する1つの答えです。 – gvrocha

1

あなたが使用することができます:Pythonはこれを実行するに

は、それは確かにより慣用であります次のコードスニペット。 readlines()は一度にファイル全体を読み込み、行単位で分割します。

line = obj.readlines() 
6

「それを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)

+0

@TessellatingHecklerは、[ドキュメンテーション](https://docs.python.org/2/library/exceptions.html#exceptions.EOFError)とは異なります: "組み込み関数の1つ(input )またはraw_input())は、データを読み取ることなくファイルの終わりの条件(EOF)にヒットします。 –

+1

@ TadhgMcDonald-Jensenうーん、そうだよ。どのように奇妙です。偽のクレームが引っ込められ、不公平なダウンワードが削除されました。 – TessellatingHeckler