Чтение бинарных файлов с использованием python3 - PullRequest
2 голосов
/ 07 мая 2019

Я пытаюсь прочитать 16-битный двоичный файл в python3 и получаю следующую ошибку

out = struct.unpack ("h", bytes)
ошибка:для распаковки требуется буфер в 2 байта

import struct
for line in file_read:
    bytes = file_read.read(2)
    out = struct.unpack("h", bytes)
    file_write.write(str(out))

. Любое предложение о том, где я могу пойти не так, будет высоко оценено.

Ответы [ 2 ]

3 голосов
/ 07 мая 2019

Вы просматриваете свой файл как по строкам, так и по байтовым символам.

for line in file_read:  # read by line
    bytes = file_read.read(2)  # read by character

Первый ищет новые строки (b'\n' aka b'\x0A') и может использовать произвольное количество байтов.Это означает, что ваше чтение пар байтов, скорее всего, смещено на 1 и, возможно, в конец файла.

Чтение вашего файла только по парам символов.Вы можете использовать с двумя аргументами iter, чтобы удобно сделать это в цикле for:

for pair in iter(lambda: file_read.read(2), b''):
    out = struct.unpack("h", pair)
    file_write.write(str(out))

В Python 3.8 вы можете использовать выражение присваивания , а также:

while pair := file_read.read(2):
    out = struct.unpack("h", pair)
    file_write.write(str(out))
1 голос
/ 07 мая 2019

Скорее всего, file_read пусто или становится пустым после чтения line (как заметил @MisterMiyagi, чтение бинарных файлов построчно не кажется хорошей идеей).Так что file_read.read ничего не читает или только один байт.Вы можете проверить это, напечатав len(bytes).

...