Чтение определенных байтов из файла в PYTHON - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу прочитать определенную часть двоичного файла.Я буду реализовывать двоичный файл для «имитации» массива.

Например, предположим, что все объекты будут иметь одинаковый размер (гипотетически 22 байта):

  • Вставка объекта виндекс 0 будет занимать от 0 до 22 байт файла.
  • Вставка объекта с индексом 1 будет занимать от 22 до 44 байт файла.

Итак, когда я вставляюэти два объекта, я успешно прочитал второй, но я получаю ошибку при попытке прочитать первый.

Импорт

import pickle
from sys import getsizeof

Вставка первого объекта

with open("test2", "wb") as f:
buffer = pickle.dumps(10)
print(getsizeof(buffer))
f.write(buffer)
f.close

Консоль:

22 * ​​1022 *

Поэтому я вставляю другой номер в позицию 22, используя seek ()

with open("test2", "wb") as f:
buffer = pickle.dumps(20)
f.seek(22,1)
print(getsizeof(buffer))
f.write(buffer)
f.close

Консоль comproving size sabe

22 * ​​1031 *

Теперь пытаемся прочитать второе число (число 20)

with open("test2", "rb") as f:
f.seek(22,1)
buffer = f.read()
print(getsizeof(buffer))
print(pickle.loads(buffer))
f.close

Журнал консоли успешно показывает число и его размер в байтах

22 20

Но теперь, при попытке прочитать первое:

with open("test2", "rb") as f:
buffer = f.read(22)
print(getsizeof(buffer))
print(pickle.loads(buffer))
f.close

Консоль shНеправильно запрошенный размер байта

39

И ошибка

Возникло исключение: _pickle.UnpicklingErrorload key, '\ x00'.

Не знаю, актуально ли это, но это все, что прочитано в файле

b '\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x80 \ x03K \ x14. '

...