81
fp = open("a.txt")
#do many things with fp

c = fp.read()
if c is None:
    print 'fp is at the eof'

上記の方法に加えて、fpがすでにeofにあるかどうかを確認する他の方法はありますか?

4

22 に答える 22

79

fp.read()ファイルの最後まで読み取るため、ファイルが正常に終了すると、ファイルがEOFにあることがわかります。チェックする必要はありません。EOFに到達できない場合は、例外が発生します。

を使用するのではなく、チャンクでファイルを読み取る場合、要求したバイト数よりも少ない数を返すread()ときにEOFに到達したことがわかります。readその場合、次のread呼び出しは空の文字列を返します(ではありませんNone)。次のループは、ファイルをチャンクで読み取ります。readせいぜい一度は多すぎます。

assert n > 0
while True:
    chunk = fp.read(n)
    if chunk == '':
        break
    process(chunk)

または、短い:

for chunk in iter(lambda: fp.read(n), ''):
    process(chunk)
于 2012-04-13T11:55:04.853 に答える
55

「for-else」設計は見過ごされがちです。参照: Python ドキュメント「ループ内の制御フロー」 :

with open('foobar.file', 'rb') as f:
    for line in f:
        foo()

    else:
        # No more lines to be read from file
        bar()
于 2014-07-14T14:18:44.410 に答える
34

ファイルからの読み取りは、ファイルにさらにデータが含まれているかどうかを確認するための最も信頼できる方法であると私は主張します。パイプの場合もあれば、別のプロセスがファイルなどにデータを追加している場合もあります。

それが問題ではないことがわかっている場合は、次のようなものを使用できます。

f.tell() == os.fstat(f.fileno()).st_size
于 2012-04-13T11:54:37.053 に答える
19

Pythonは「EOF」自体ではなく、EOFで空の文字列を返すため、ここに書かれたコードを確認するだけです

f1 = open("sample.txt")

while True:
    line = f1.readline()
    print line
    if ("" == line):
        print "file finished"
        break;
于 2016-06-16T09:51:09.047 に答える
9

fp.tell()メソッドを呼び出す前と後の戻り値を比較できますread。それらが同じ値を返す場合、fpはeofにあります。

さらに、サンプルコードが実際に機能するとは思いません。read私の知る限り、このメソッドはを返すNoneことはありませんが、eofで空の文字列を返します。

于 2012-04-13T11:54:26.197 に答える
8
f=open(file_name)
for line in f:
   print line
于 2014-12-09T07:08:41.473 に答える
8

read は、EOF が検出されると空の文字列を返します。ドキュメントはこちら.

于 2012-04-13T11:55:24.417 に答える
4

ファイルが非ブロックモードで開かれている場合、予想よりも少ないバイトを返すことは、それがeofにあることを意味しません。@NPEの答えが最も信頼できる方法だと思います:

f.tell() == os.fstat(f.fileno()).st_size

于 2013-09-10T04:37:33.350 に答える
2

Python読み取り関数は、EOFに達すると、空の文字列を返します

于 2012-04-13T11:55:02.997 に答える
0

個人的にはwithステートメントを使用してファイルの開閉を処理しますが、stdin から読み取る必要があり、EOF 例外を追跡する必要がある場合は、次のようにします。

EOFError例外としてtry-catch を使用します。

try:
    input_lines = ''
    for line in sys.stdin.readlines():
        input_lines += line             
except EOFError as e:
    print e
于 2016-01-12T04:19:05.083 に答える
0

このコードは python 3 以降で動作します

file=open("filename.txt")   
f=file.readlines()   #reads all lines from the file
EOF=-1   #represents end of file
temp=0
for k in range(len(f)-1,-1,-1):
    if temp==0:
        if f[k]=="\n":
            EOF=k
        else:
            temp+=1
print("Given file has",EOF,"lines")
file.close()
于 2020-08-04T06:17:12.417 に答える