Как записать много объектов в двоичный файл и прочитать его специфический объект? - PullRequest
0 голосов
/ 17 сентября 2018

В Python мне нужно разработать простую программу для записи и чтения объектов в двоичном файле.Там будет максимум 11 записей, которые будут вставлены, загружены или удалены по одной.Это что-то вроде файла имеет 11 слотов, и когда данные вставляются, индекс слотов будет передан.Поэтому, когда пользователь пытается вставить индекс, который уже заполнен, происходит сбой, и пользователь получает сообщение.

Итак, моя идея состояла в том, чтобы сохранить данные в зависимости от размера объекта.Например: если пользователь вставит данные в индекс 3, я не вставлю его в начало файла, начну вставлять в «3 * (размер объекта)»

Но проблема в том, что объектыразмеры не всегда одинаковы, поэтому теряется ссылка на запрошенные данные.

import pickle

class Reg:
    def __init__(self, id, name):
        self.id = id
        self.name = name

    def display(self):
        print("{}: {}".format(self.id, self.name))

user = Reg(642213, "{}{}".format("José da Silva", 642213))
print(len(pickle.dumps(user)))
user = Reg(462903, "{}{}".format("Carlos Ribeiro", 462903))
print(len(pickle.dumps(user)))
user = Reg(502453, "{}{}".format("Alberto", 502453))
print(len(pickle.dumps(user)))
user = Reg(189567, "{}{}".format("Rodrigo Peixoto Gama", 189567))
print(len(pickle.dumps(user)))

Журнал консоли: 81 81 74 87

Итак, как мне это сделать?Есть ли способ установить размер по умолчанию для всех объектов?

1 Ответ

0 голосов
/ 17 сентября 2018

Два пути.

Во-первых, если вы знаете максимальный размер объектов, вы можете использовать его как фиксированный размер для всех них.Протокол объекта не должен иметь проблем с обнаружением конца объекта, когда вы слишком много читаете.

Второй способ - создать «индекс».

Индекс представляет собой коллекциюиз 11 смещений фиксированной длины, хранящихся в начале файла.

Затем, когда вы добавляете новый объект, вы можете просто обновить индекс с его смещением.Таким образом, вы также можете расположить вещи «не по порядку» (т. Е. «3-й» элемент - это 3-й слот в индексе, но первый объект в данных).

Очевидно, что в более сложных сценариях они обаполучить гораздо больше нюансов.

Но если ваш пример ограничен, любой может сделать свое дело.

Дополнения:

С одной стороны, вы можете дополнить имя до20 символов с пробелами и просто обрежьте их позже.Это делает их всех одинакового размера.

С другой стороны, это не имеет значения.Вам нужно сделать случайный ввод-вывод, чтобы найти объекты.Вы можете просто искать правильное смещение в файле и записывать / читать оттуда.Процесс засолки сделает все остальное.

Таким образом, в этом случае вам не нужно знать, насколько велики объекты, лишь бы они не были слишком длинными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...