Чтение двоичного файла в Python в структуру - PullRequest
1 голос
/ 19 мая 2010

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

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()

Ответы [ 2 ]

6 голосов
/ 19 мая 2010

Простейший (python 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 голосов
/ 19 мая 2010

Изменение

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

до

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