2017-01-17 15 views
2

Я пытаюсь прочитать файл в python как двоичный. Im заинтересованы в четырех байт в то время, но я, кажется, застрял в печально известной в то время как петля:Python, EOF двоичный

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

print "EOF" 

Я пытался это за последний час, я никогда не достигнет конца файла, даже в крошечных текстовых файлах. Я сделал «print test = file.read (4)« только чтобы увидеть, что он печатает »«

Как я могу убедиться, что он остановился? Моя первая идея заключалась в том, чтобы сделать утверждение if, говорящее, что file.read (4) (в переменной) == "" {4} или что-то в этом роде, но это может действительно отображаться в файле, верно? поэтому он мог бы остановиться в середине.

Единственный другой вариант, чтобы заранее рассчитать размер файла?

ответ

2

В конце файла, file.read(..) возвращает байт (или строку в зависимости от вашего питона версии):

Проверьте возвращаемое значение 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' никогда не будет' Falsy'. 'while file' whould be' 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', но вы правы. Пожалуйста, улучшите свой пост немного, чтобы я мог продвинуться :) –

+0

@ Jean-FrançoisFabre О, я вижу. Спасибо, спасибо. –

+0

в python 3, да. В python 2 это 'файл'. Однако формулировка плохая: «list» - это объект и может быть обработан как «ложный» при пустом. То же самое для пустой строки. Это не настоящая причина. Причина в том, что файл-объект имеет тип, который _cannot_ будет «ложным», когда файл будет полностью прочитан, в отличие от шаблона C++. –