> **Источник:** https://python-all.ru/3.4/library/plistlib.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 14.5. [`plistlib`](https://python-all.ru/3.4/library/plistlib.html#module-plistlib) – Генерация и разбор файлов Mac OS X `.plist`

**Исходный код:** [Lib/plistlib.py](https://python-all.ru/src/3.4/Lib/plistlib.py)

---

Этот модуль предоставляет интерфейс для чтения и записи файлов «property list» (списков свойств), используемых в основном в Mac OS X, и поддерживает как двоичные, так и XML-файлы plist.

Формат файла property list (`.plist`) – это простая сериализация, поддерживающая базовые типы объектов, такие как словари, списки, числа и строки. Обычно объектом верхнего уровня является словарь.

Для записи и разбора файла plist используйте функции [`dump()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.dump) и [`load()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.load).

Для работы с данными plist в виде байтовых объектов используйте [`dumps()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.dumps) и [`loads()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.loads).

Значениями могут быть строки, целые числа, числа с плавающей запятой, булевы значения, кортежи, списки, словари (но только со строковыми ключами), [`Data`](https://python-all.ru/3.4/library/plistlib.html#plistlib.Data), [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), `bytesarray` или [`datetime.datetime`](https://python-all.ru/3.4/library/datetime.html#datetime.datetime) объекты.

Изменено в версии 3.4: Новый API, старый API помечен как устаревший. Добавлена поддержка бинарного формата списков свойств.

> **См. также**
>
> **[Страница руководства PList](https://python-all.ru/3.4/library/plistlib.html)**
>
> Документация Apple по формату файлов.

Этот модуль определяет следующие функции:

#### `plistlib.load(fp, *, fmt=None, use_builtin_types=True, dict_type=dict)`

Читает plist-файл. *fp* должен быть читаемым бинарным файловым объектом. Возвращает распакованный корневой объект (обычно это словарь).

Параметр *fmt* задаёт формат файла; допустимы следующие значения:

- [`None`](https://python-all.ru/3.4/library/constants.html#None): Автоматически определять формат файла
- [`FMT_XML`](https://python-all.ru/3.4/library/plistlib.html#plistlib.FMT_XML): Формат файла XML
- [`FMT_BINARY`](https://python-all.ru/3.4/library/plistlib.html#plistlib.FMT_BINARY): Двоичный формат plist

Если *use\_builtin\_types* равен true (по умолчанию), двоичные данные будут возвращены в виде экземпляров [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes), в противном случае они возвращаются в виде экземпляров [`Data`](https://python-all.ru/3.4/library/plistlib.html#plistlib.Data).

Параметр *dict\_type* – это тип, используемый для словарей, читаемых из файла plist. Точную структуру plist можно восстановить, используя [`collections.OrderedDict`](https://python-all.ru/3.4/library/collections.html#collections.OrderedDict) (хотя порядок ключей не должен быть важен в файлах plist).

XML-данные для формата [`FMT_XML`](https://python-all.ru/3.4/library/plistlib.html#plistlib.FMT_XML) разбираются с помощью парсера Expat из [`xml.parsers.expat`](https://python-all.ru/3.4/library/pyexpat.html#module-xml.parsers.expat) – см. его документацию для получения информации о возможных исключениях при некорректном XML. Неизвестные элементы будут просто проигнорированы парсером plist.

Парсер двоичного формата вызывает исключение `InvalidFileException`, когда файл не может быть разобран.

Новое в версии 3.4.

#### `plistlib.loads(data, *, fmt=None, use_builtin_types=True, dict_type=dict)`

Загружает plist из байтового объекта. Описание именованных аргументов см. в [`load()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.load).

Новое в версии 3.4.

#### `plistlib.dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False)`

Записывает *value* в plist-файл. *Fp* должен быть записываемым бинарным файловым объектом.

Аргумент *fmt* задаёт формат plist-файла и может принимать одно из следующих значений:

- [`FMT_XML`](https://python-all.ru/3.4/library/plistlib.html#plistlib.FMT_XML): файл plist в формате XML
- [`FMT_BINARY`](https://python-all.ru/3.4/library/plistlib.html#plistlib.FMT_BINARY): файл plist в двоичном формате

Если *sort\_keys* имеет значение true (по умолчанию), ключи словарей записываются в plist в отсортированном порядке, иначе – в порядке обхода словаря.

Если *skipkeys* равен false (по умолчанию), функция вызывает исключение [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError), когда ключ словаря не является строкой, в противном случае такие ключи пропускаются.

Исключение [`TypeError`](https://python-all.ru/3.4/library/exceptions.html#TypeError) будет возбуждено, если объект имеет неподдерживаемый тип или является контейнером, содержащим объекты неподдерживаемых типов.

Исключение [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError) будет возбуждено для целочисленных значений, которые не могут быть представлены в (двоичных) файлах plist.

Новое в версии 3.4.

#### `plistlib.dumps(value, *, fmt=FMT_XML, sort_keys=True, skipkeys=False)`

Возвращает *value* в виде байтового объекта в формате plist. Описание именованных аргументов этой функции см. в документации к [`dump()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.dump).

Новое в версии 3.4.

Следующие функции устарели:

#### `plistlib.readPlist(pathOrFile)`

Читает plist-файл. *pathOrFile* может быть именем файла или (читаемым и бинарным) файловым объектом. Возвращает распакованный корневой объект (который обычно является словарём).

Эта функция вызывает [`load()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.load) для выполнения фактической работы; описание именованных аргументов см. в документации [`этой функции`](https://python-all.ru/3.4/library/plistlib.html#plistlib.load).

> **Примечание**
>
> Словарные значения в результате имеют метод `__getattr__`, который делегирует вызов `__getitem_`. Это означает, что для доступа к элементам этих словарей можно использовать доступ к атрибутам.

Устарело с версии 3.4: Вместо этого используйте [`load()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.load).

#### `plistlib.writePlist(rootObject, pathOrFile)`

Записывает *rootObject* в XML plist-файл. *pathOrFile* может быть именем файла или (доступным для записи и бинарным) файловым объектом

Устарело с версии 3.4: Вместо этого используйте [`dump()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.dump).

#### `plistlib.readPlistFromBytes(data)`

Читает plist-данные из объекта bytes. Возвращает корневой объект.

Описание именованных аргументов см. в [`load()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.load).

> **Примечание**
>
> Значения-словари в результате имеют метод `__getattr__`, который делегирует `__getitem_`. Это означает, что для доступа к элементам этих словарей можно использовать обращение через атрибуты.

Устарело с версии 3.4: Вместо этого используйте [`loads()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.loads).

#### `plistlib.writePlistToBytes(rootObject)`

Возвращает *rootObject* в виде объекта bytes, отформатированного как XML plist.

Устарело с версии 3.4: Вместо этого используйте [`dumps()`](https://python-all.ru/3.4/library/plistlib.html#plistlib.dumps).

Доступны следующие классы:

#### `Dict([dict]):`

Return an extended mapping object with the same value as dictionary *dict*.

Этот класс является подклассом [`dict`](https://python-all.ru/3.4/library/stdtypes.html#dict), в котором для доступа к элементам можно использовать обращение через атрибуты. То есть `aDict.key` эквивалентно `aDict['key']` для получения, установки и удаления элементов отображения.

Устарело с версии 3.0.

#### `class plistlib.Data(data)`

Возвращает объект-обёртку «data» вокруг байтового объекта *data*. Используется в функциях преобразования из plist-формата и обратно для представления типа `<data>`, доступного в plist-файлах.

У него есть один атрибут `data`, который можно использовать для получения хранящегося в нём объекта bytes языка Python.

Устарело с версии 3.4: Вместо этого используйте объект [`bytes`](https://python-all.ru/3.4/library/functions.html#bytes).

Доступны следующие константы:

#### `plistlib.FMT_XML`

Формат XML для файлов plist.

Новое в версии 3.4.

#### `plistlib.FMT_BINARY`

Бинарный формат для файлов plist

Новое в версии 3.4.

## 14.5.1. Примеры

Генерация plist:

```python
pl = dict(
    aString = "Doodah",
    aList = ["A", "B", 12, 32.1, [1, 2, 3]],
    aFloat = 0.1,
    anInt = 728,
    aDict = dict(
        anotherString = "<hello & hi there!>",
        aThirdString = "M\xe4ssig, Ma\xdf",
        aTrueValue = True,
        aFalseValue = False,
    ),
    someData = b"<binary gunk>",
    someMoreData = b"<lots of binary gunk>" * 10,
    aDate = datetime.datetime.fromtimestamp(time.mktime(time.gmtime())),
)
with open(fileName, 'wb') as fp:
    dump(pl, fp)
```

Разбор plist:

```python
with open(fileName, 'rb') as fp:
    pl = load(fp)
print(pl["aKey"])
```
