2010-05-19 2 views
1

Как мне начать открытие двоичного файла данных в Python и считывание значений один long за один раз в структуру. У меня есть что-то вроде этого в данный момент, но я думаю, что это будет держать перезапись idList, я хочу добавить к нему, так что я в конечном итоге с кортежем всех long значений в файле -Чтение двоичного файла в Python в структуру

file = open(filename, "rb") 

     try: 
      bytes_read = file.read(struct.calcsize("=l")) 
      while bytes_read: 

       # Read 4 bytes(long integer) 
       idList = struct.unpack("=l", bytes_read) 

       bytes_read = file.read(struct.calcsize("=l")) 
     finally: 
      file.close() 

Спасибо.

ответ

6

Простейшие (питон 2,6 или лучше):

import array 
idlist = array.array('l') 
with open(filename, "rb") as f: 
    while True: 
     try: idlist.fromfile(f, 2000) 
     except EOFError: break 
idtuple = tuple(idlist) 

кортежи неизменны, поэтому они не могут быть построены по нарастающей: так что вы должны построить другую (изменяемый) последовательность, а затем вызвать tuple на него в конец. Если вы на самом деле не нуждаетесь в, то определенно кортеж, конечно, вы можете сохранить последний, дорогостоящий шаг и сохранить массив или список или что-то еще. В любом случае желательно избегать попирания встроенных имен, таких как file ;-).

Если есть использовать struct модуль для работы, которая лучше всего обрабатывается модулем array (например, из-за ставки),

idlist = [ ] 
with open(filename, "rb") as f: 
    while True: 
     bytes_read = f.read(struct.calcsize("=l")) 
     if not bytes_read: break 
     oneid = struct.unpack("=l", bytes_read)[0] 
     idlist.append(oneid) 

with заявление (также доступен в версии 2.5 с импорт из будущего) лучше старой попытки/окончательно в ясности и лаконичности.

+0

Спасибо. К сожалению, мы ограничены использованием Python 2.5 на данный момент, как бы это отличалось в этом? –

+0

@Adam, просто добавьте 'из __future__ import with_statements' в начале модуля. –

+0

В примере массива вы вызываете fromfile со значением 2000, должно ли это быть не 4, для четырех байтовых целых чисел? Или я не понимаю эту функцию? –

0

Изменить

idList = struct.unpack("=l", bytes_read) 

в

idList.append(struct.unpack("=l", bytes_read)[0])