Строки могут быть легко записаны и считаны из файла. Числа требуют немного больше усилий, так как метод file.read()
возвращает только строки, которые должны быть переданы функции int()
, которая принимает строку типа '123'
и возвращает ее числовое значение 123
. Когда вы хотите сохранить более сложные типы данных, такие как вложенные списки и словари, разбор и сериализация вручную усложняются.
Вместо того, чтобы пользователи постоянно писали и отлаживали код для сохранения сложных типов данных в файлы, Python позволяет использовать популярный формат обмена данными, называемый JSON
(JavaScript Object Notation). Стандартный модуль, называемый json
, может принимать иерархии данных Python и преобразовывать их в строковые представления. Этот процесс называется сериализацией. Восстановление данных из строкового представления называется десериализацией. Между сериализацией и десериализацией строка, представляющая объект, может быть сохранена в файле или отправлена по сетевому соединению на какой-либо удаленный компьютер.
Если у вас есть объект x
, вы можете просмотреть его строковое представление JSON
с помощью простой строки кода:
>>> import json >>> json.dumps([1, 'simple', 'list']) # '[1, "simple", "list"]'
Другой метод этого модуля json.dump()
просто сериализует объект в текстовый файл. Итак, если объект fp
текстового файла открыт для записи, мы можем сделать следующее:
json.dump(x, fp)
Чтобы снова декодировать объект, если fp
это объект текстового файла, который был открыт для чтения:
x = json.load(fp)
Этот простой метод сериализации может обрабатывать списки и словари, но сериализация произвольных экземпляров классов в JSON
требует дополнительных усилий.
Дополнительно смотрите встроенный модуль pickle
. В отличие от JSON
, pickle
- это протокол, который позволяет сериализовать произвольно сложные объекты Python.
Протокол pickle
специфичен для Python и не может использоваться для связи с приложениями, написанными на других языках. Он также по умолчанию небезопасен! Десериализация данных pickle
, поступающих из ненадежного источника, может выполнить произвольный код, если данные были созданы опытным злоумышленником.