plistlib — Generate and parse Apple .plist files

Вихідний код: Lib/plistlib.py


Цей модуль надає інтерфейс для читання та запису файлів «списку властивостей», які використовуються Apple, переважно в macOS та iOS. Цей модуль підтримує двійкові та XML-файли plist.

Формат файлу списку властивостей (.plist) — це проста серіалізація, яка підтримує базові типи об’єктів, як-от словники, списки, числа та рядки. Зазвичай об’єктом верхнього рівня є словник.

Щоб вивести та проаналізувати файл plist, використовуйте функції dump() і load().

To work with plist data in bytes objects, use dumps() and loads().

Значеннями можуть бути рядки, цілі числа, числа з плаваючою точкою, логічні значення, кортежі, списки, словники (але лише з рядковими ключами), об’єкти bytes, bytearray або datetime.datetime.

Змінено в версії 3.4: Новий API, старий API застарів. Додано підтримку бінарних форматів plists.

Змінено в версії 3.8: Додано підтримку для читання та запису токенів UID у бінарних списках, що використовуються NSKeyedArchiver і NSKeyedUnarchiver.

Змінено в версії 3.9: Старий API видалено.

Дивись також

PList manual page

Документація Apple про формат файлу.

Цей модуль визначає такі функції:

plistlib.load(fp, *, fmt=None, dict_type=dict)

Прочитайте файл plist. fp має бути читабельним і двійковим файловим об’єктом. Повертає розпакований кореневий об’єкт (який зазвичай є словником).

fmt — це формат файлу, і такі значення є дійсними:

  • None: Автоматичне визначення формату файлу

  • FMT_XML: формат файлу XML

  • FMT_BINARY: двійковий формат plist

dict_type — це тип, який використовується для словників, які читаються з файлу plist.

XML-дані для формату FMT_XML аналізуються за допомогою синтаксичного аналізатора Expat із xml.parsers.expat — перегляньте його документацію щодо можливих винятків щодо неправильно сформованого XML. Невідомі елементи просто ігноруватимуться аналізатором plist.

Синтаксичний аналізатор двійкового формату викликає InvalidFileException, коли файл не може бути проаналізований.

Нове в версії 3.4.

plistlib.loads(data, *, fmt=None, dict_type=dict)

Load a plist from a bytes object. See load() for an explanation of the keyword arguments.

Нове в версії 3.4.

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

Запишіть значення у файл plist. Fp має бути доступним для запису двійковим файловим об’єктом.

Аргумент fmt визначає формат файлу plist і може бути одним із таких значень:

  • FMT_XML: Plist-файл у форматі XML

  • FMT_BINARY: файл plist у двійковому форматі

Якщо sort_keys має значення true (за замовчуванням), ключі для словників будуть записані до plist у відсортованому порядку, інакше вони будуть записані в порядку ітерацій словника.

Якщо skipkeys має значення false (за замовчуванням), функція викликає TypeError, коли ключ словника не є рядком, інакше такі ключі пропускаються.

Якщо тип об’єкта не підтримується або контейнер містить об’єкти непідтримуваних типів, виникне TypeError.

Помилка OverflowError буде викликана для цілих значень, які не можуть бути представлені в (бінарних) файлах plist.

Нове в версії 3.4.

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

Повертає значення як об’єкт bytes у форматі plist. Перегляньте документацію для dump() для пояснення ключових аргументів цієї функції.

Нове в версії 3.4.

Доступні такі класи:

class plistlib.UID(data)

Обгортає int. Це використовується під час читання або запису даних, закодованих NSKeyedArchiver, які містять UID (див. посібник PList).

Він має один атрибут, data, який можна використовувати для отримання int-значення UID. data має бути в діапазоні 0 <= data < 2**64.

Нове в версії 3.8.

Доступні такі константи:

plistlib.FMT_XML

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

Нове в версії 3.4.

plistlib.FMT_BINARY

Двійковий формат для файлів plist

Нове в версії 3.4.

Приклади

Створення plist:

import datetime
import plistlib

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.now()
)
print(plistlib.dumps(pl).decode())

Розбір plist:

import plistlib

plist = b"""<plist version="1.0">
<dict>
    <key>foo</key>
    <string>bar</string>
</dict>
</plist>"""
pl = plistlib.loads(plist)
print(pl["foo"])