Я хочу прочитать определенную часть двоичного файла.Я буду реализовывать двоичный файл для «имитации» массива.
Например, предположим, что все объекты будут иметь одинаковый размер (гипотетически 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. '