Простой Python. Современный стиль программирования (Любанович) - страница 130

Другие форматы обмена данными

Такие бинарные форматы обмена данными, как MsgPack (http://msgpack.org/), Protocol Buffers (https://code.google.com/p/protobuf/), Avro (http://avro.apache.org/docs/current/), Thrift (http://thrift.apache.org/), обычно компактнее и быстрее, чем XML или JSON. Поскольку они бинарные, ни один из них не может быть изменен человеком, вооружившимся текстовым редактором.

Сериализация с помощью pickle

Сохранение структур данных в файл называется сериализацией. Форматы вроде JSON могут требовать наличия пользовательских преобразователей для сериализации всех типов данных программы, написанной на Python. Python предоставляет модуль pickle, позволяющий сохранить и восстановить любой объект в специальном бинарном формате.

Помните, как JSON сошел с ума, когда встретил объект datetime? Для pickle это не проблема:

>>>> import pickle

>>>> import datetime

>>>> now1 = datetime.datetime.utcnow()

>>>> pickled = pickle.dumps(now1)

>>>> now2 = pickle.loads(pickled)

>>>> now1

>datetime.datetime(2014, 6, 22, 23, 24, 19, 195722)

>>>> now2

>datetime.datetime(2014, 6, 22, 23, 24, 19, 195722)

pickle работает также с вашими собственными классами и объектами. Мы определим небольшой класс, который называется Tiny и возвращает слово 'tiny', когда он используется как строка:

>>>> import pickle

>>>> class Tiny():

>…·····def __str__(self):

>…········return 'tiny'

>…

>>>> obj1 = Tiny()

>>>> obj1

><__main__.Tiny object at 0x10076ed10>

>>>> str(obj1)

>'tiny'

>>>> pickled = pickle.dumps(obj1)

>>>> pickled

>b'\x80\x03c__main__\nTiny\nq\x00)\x81q\x01.'

>>>> obj2 = pickle.loads(pickled)

>>>> obj2

><__main__.Tiny object at 0x10076e550>

>>>> str(obj2)

>'tiny'

pickled — это обработанная pickle бинарная строка, созданная из объекта obj1. Мы преобразовали ее в объект obj2, чтобы сделать копию объекта obj1. Используйте функцию dump(), чтобы pickle сохранил данные в файл, и функцию load(), чтобы pickle загрузил данные из файла.


Поскольку pickle может создавать объекты Python, к нему применимы предупреждения о безопасности, которые были рассмотрены ранее. Не загружайте в pickle данные, которым не доверяете.

Структурированные бинарные файлы

Некоторые файловые форматы были разработаны для того, чтобы хранить определенные структуры данных, и они не являются ни реляционными, ни базами данных NoSQL. В следующих разделах рассказывается о некоторых из них.

Электронные таблицы

Электронные таблицы, в частности Microsoft Excel, — это широко распространенный формат данных. Если вы можете сохранить свою таблицу в CSV-файл, то можете считать его с помощью стандартного модуля csv, который был описан ранее. Если у вас есть бинарный файл xls, для его считывания и записи можете использовать стороннюю библиотеку xlrd.