2017-01-17 3 views
2

私はバイナリとしてPythonでファイルを読み込もうとしています。 時点での4つのバイトに興味イムは、しかし、私は悪名高いwhileループで立ち往生しているように見える:私は過去の時間のためにこれをしようとしてきたPython、EOF binary

with open(filename, "rb") as file: 
     while file: 
      file.read(4) 

print "EOF" 

、私も、ファイルの末尾に到達することはありません小さなテキストファイルで。私は "print test = file.read(4)"を実行して "それが印刷されている"ことを確認しました

どのようにして停止することができますか?私の最初のアイデアは、file.read(4)(変数内)== "" {4}か何かをif文で作成することでしたが、これは実際にファイルに表示される可能性があります。それは潜在的にその途中で停止する可能性があります。

ファイルのサイズを事前に計算する唯一の他のオプションはありますか?ファイルの終わりに

答えて

2

file.read(..)は(あなたのPythonのバージョンに応じて、または文字列)のバイトを返します。

file.readの戻り値を確認してください。それが空の場合は破る:

with open(filename, "rb") as file: 
    while True: # --> replaced `file` with `True` to be clear 
     data = file.read(4) 
     if not data: # empty => EOF 
     # OR if len(data) < 4: if you don't want last incomplete chunk 
      break 
     # process data 
+1

'file'は決して' FALSEY'にはなりません。 'while file'は' while True'です。 –

+0

@ Jean-FrançoisFabre、ありがとうございます。それに応じてコードを更新します。ところで、変更前であっても、コードは 'if ... break'のために動作するはずです – falsetru

+0

Brilliant!ありがとうalot – user7430676

1

fileは_io.BufferReaderオブジェクトではなく、Noneので、Falseとして扱われることはありません。

file.read(4)の戻り値が空の文字列(Falseとして扱われる)かどうかを確認する必要があります。

+0

'File'オブジェクトはありませんが、あなたは正しいです。私はupvoteことができるようにあなたのポストを少し強化してください:) –

+0

@ Jean-FrançoisFabreああ、私は参照してください。 _io.BufferReader、ありがとうございます。 Python 3では –

+0

、そうです。 Python 2では 'file'です。しかし、文法は悪いです: 'list'はオブジェクトであり、空のときは"偽 "として扱うことができます。空の文字列と同じです。それは本当の理由ではありません。その理由は、ファイルオブジェクトが、C++パターンとは異なり、ファイルが完全に読み込まれたときに「偽」になることがないタイプです。 –