Либо файл dbm, поддерживающий вашу полку, поврежден, либо у вас есть какая-то несовместимость между вашим файлом и внутренней библиотекой dbm
, используемой для вашего файла полки.
shelve
поддерживается модулем dbm
, и именно от вашей ОС зависит, какая именно реализация используется, но, вообще говоря, файл dbm
находится на диске хеш-таблица , структура данных, которая использует структуру разреженных таблиц для более эффективного нахождения ключей позже.
Чтобы показать вам все ключи в файле, библиотека dbm
просканирует таблицу и выдаст вам каждый ключ, когда обнаружит непустую ячейку. Но чтобы найти значение для данного ключа, ему нужно было бы хэш ключ, чтобы найти число от нуля до максимального размера таблицы, посмотреть на соответствующую строку в таблице и получить значение.
Между этими двумя техниками есть расхождение; у вас, кажется, есть ключи в неправильном месте в таблице . Трудно сказать, как это произошло, возможно, повреждение файла изменило бухгалтерию, а фактический размер таблицы отличается от того, что говорится в бухгалтерии. Возможно, вы поменяли машины, и реализация хеширования теперь неверна. Или что-то еще, но мы не можем там помочь, извините.