# 14.5. `plistlib` - 生成并解析Mac OS X `.plist`文件

源代码： Lib / plistlib.py

此模块提供了一个用于读取和写入主要由Mac OS X使用的“属性列表”文件的接口，并支持二进制和XML plist文件。

属性列表（`.plist`）文件格式是一个简单的序列化，支持基本的对象类型，如字典，列表，数字和字符串。通常顶层对象是字典。

要写出和解析plist文件，请使用`dump()`和`load()`函数。

要使用字节对象中的plist数据，请使用`dumps()`和`loads()`。

值可以是字符串，整数，浮点数，布尔值，元组，列表，字典（但只有字符串键），`Data`，`bytes`，`bytesarray`或`datetime.datetime`对象。

在版本3.4中已更改：新的API，旧的API已弃用。支持二进制格式plists添加。

也可以看看

PList手册页
  苹果的文件格式文件。

该模块定义了以下功能：

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

  读取plist文件。fp应该是一个可读的二进制文件对象。返回解包的根对象（通常是字典）。

  fmt是文件的格式，以下值有效：

  - `None`：自动检测文件格式
  - `FMT_XML`：XML文件格式
  - `FMT_BINARY`：二进制plist格式

  如果use_builtin_types为true（默认值），二进制数据将作为`bytes`的实例返回，否则返回为`Data`的实例。

  dict_type是用于从plist文件读取的字典的类型。plist的确切结构可以通过使用`collections.OrderedDict`（虽然键的顺序在plist文件中不重要）来恢复。

  `FMT_XML`格式的XML数据使用`xml.parsers.expat`中的Expat解析器解析 - 请参阅其文档，了解可能的异常XML格式的异常。未知的元素将被plist解析器简单地忽略。

  当文件无法解析时，二进制格式的解析器引发`InvalidFileException`。

  版本3.4中的新功能。

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

  从字节对象加载plist。有关关键字参数的说明，请参见`load()`。

  版本3.4中的新功能。

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

  将值写入plist文件。Fp应为可写二进制文件对象。

  fmt参数指定plist文件的格式，可以是以下值之一：

  - `FMT_XML`：XML格式化plist文件
  - `FMT_BINARY`：二进制格式化plist文件

  当sort_keys为true（默认值）时，字典的键将以排序顺序写入plist，否则它们将以字典的迭代顺序写入。

  当字典的键不是字符串时，当skipkeys为false（默认）时，函数引发`TypeError`，否则将跳过此类键。

  如果对象是不受支持的类型或包含不受支持类型的对象的容器，则会引发`TypeError`。

  对于不能在（二进制）plist文件中表示的整数值，将会引发`OverflowError`。

  版本3.4中的新功能。

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

  将值返回为plist格式的字节对象。有关此函数的关键字参数的说明，请参阅`dump()`的文档。

  版本3.4中的新功能。

以下函数已弃用：

`plistlib.``readPlist`(pathOrFile)

  读取plist文件。pathOrFile可以是文件名或（可读和二进制）文件对象。返回解包的根对象（通常是字典）。

  此函数调用`load()`进行实际工作，有关`that function`关键字参数。

  注意

  结果中的Dict值具有延迟到`__getitem_`的`__getattr__`方法。这意味着您可以使用属性访问来访问这些字典的项目。

  自3.4版起已弃用：改用`load()`。

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

  将rootObject写入XML plist文件。pathOrFile可以是文件名或（可写和二进制）文件对象

  自3.4版起已弃用：改用`dump()`。

`plistlib.``readPlistFromBytes`(data)

  从字节对象读取plist数据。返回根对象。

  有关关键字参数的说明，请参见`load()`。

  注意

  结果中的Dict值具有延迟到`__getitem_`的`__getattr__`方法。这意味着您可以使用属性访问来访问这些字典的项目。

  自3.4版起已弃用：改用`loads()`。

`plistlib.``writePlistToBytes`(rootObject)

  返回rootObject作为XML plist格式的字节对象。

  自版本3.4后已弃用：改用`dumps()`。

以下类可用：

`Dict（[dict]）：`

  返回与字典dict相同值的扩展映射对象。

  此类是`dict`的子类，其中属性访问可用于访问项目。也就是说，`aDict.key`与在映射中获取，设置和删除项目的`aDict['key']`相同。

  自3.0版起已弃用。

class `plistlib.``Data`(data)

  返回字节对象数据周围的“数据”包装器对象。这用在从/到plists转换以表示plist中可用的`<data>`类型的函数中。

  它有一个属性，`data`，可以用于检索存储在其中的Python字节对象。

  自版本3.4后已弃用：改用`bytes`物件。

以下常量可用：

`plistlib.``FMT_XML`

  plist文件的XML格式。

  版本3.4中的新功能。

`plistlib.``FMT_BINARY`

  plist文件的二进制格式

  版本3.4中的新功能。

## 14.5.1. Examples

生成plist：

    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：

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