Ответ 1
У файлов Pickle нет заголовка, поэтому нет стандартного способа идентифицировать их, за исключением попыток снять его и увидеть, возникают ли при этом какие-либо исключения.
Вы можете определить свой собственный расширенный протокол, который включает в себя какой-то заголовок, создав подклассы классов Pickler()
и Unpickler()
в модуле pickle
. Однако это невозможно сделать с помощью гораздо более быстрого модуля cPickle
, поскольку эти две функции являются заводскими функциями, которые нельзя разделить на подклассы [1].
Более гибкий подход будет определять ваши собственные независимые классы, которые использовали соответствующие экземпляры Pickler()
и Unpickler()
из любого из этих модулей в своей реализации.
Обновление
Последним байтом всех файлов pickle должен быть код операции pickle.STOP
, поэтому, хотя заголовка нет, - это фактически очень минимальный трейлер, который было бы относительно просто проверить.
В зависимости от вашего точного использования вы можете избежать добавления к нему чего-то более сложного (и длиннее одного байта), поскольку любые данные после кода операции STOP
в представлении засоленных объектов игнорируются [2].
-
[1] Сноска [2] в документации по Python 2.
[2] Документация для
pickle.loads()
, которая также применяется к pickle.load()
, поскольку в настоящее время она применяется в терминах первого.