fp = open("a.txt")
#do many things with fp
c = fp.read()
if c is None:
print 'fp is at the eof'
上記の方法に加えて、fpがすでにeofにあるかどうかを確認する他の方法はありますか?
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)
「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()
ファイルからの読み取りは、ファイルにさらにデータが含まれているかどうかを確認するための最も信頼できる方法であると私は主張します。パイプの場合もあれば、別のプロセスがファイルなどにデータを追加している場合もあります。
それが問題ではないことがわかっている場合は、次のようなものを使用できます。
f.tell() == os.fstat(f.fileno()).st_size
Pythonは「EOF」自体ではなく、EOFで空の文字列を返すため、ここに書かれたコードを確認するだけです
f1 = open("sample.txt")
while True:
line = f1.readline()
print line
if ("" == line):
print "file finished"
break;
fp.tell()
メソッドを呼び出す前と後の戻り値を比較できますread
。それらが同じ値を返す場合、fpはeofにあります。
さらに、サンプルコードが実際に機能するとは思いません。read
私の知る限り、このメソッドはを返すNone
ことはありませんが、eofで空の文字列を返します。
f=open(file_name)
for line in f:
print line
read は、EOF が検出されると空の文字列を返します。ドキュメントはこちら.
ファイルが非ブロックモードで開かれている場合、予想よりも少ないバイトを返すことは、それがeofにあることを意味しません。@NPEの答えが最も信頼できる方法だと思います:
f.tell() == os.fstat(f.fileno()).st_size
Python読み取り関数は、EOFに達すると、空の文字列を返します
個人的にはwith
ステートメントを使用してファイルの開閉を処理しますが、stdin から読み取る必要があり、EOF 例外を追跡する必要がある場合は、次のようにします。
EOFError
例外としてtry-catch を使用します。
try:
input_lines = ''
for line in sys.stdin.readlines():
input_lines += line
except EOFError as e:
print e
このコードは 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()