plistlib — 生成和解析 Apple .plist 文件

源代码: Lib/plistlib.py


此模块提供了一个用于读取和写入 Apple 公司使用的“属性列表”文件的接口,主要用于 macOS 和 iOS。此模块支持二进制和 XML plist 文件。

属性列表 (.plist) 文件格式是一种简单的序列化格式,支持基本对象类型,如字典、列表、数字和字符串。通常,顶级对象是一个字典。

要写入和解析 plist 文件,请使用 dump()load() 函数。

要处理字节对象中的 plist 数据,请使用 dumps()loads()

值可以是字符串、整数、浮点数、布尔值、元组、列表、字典(但只能使用字符串键)、bytesbytearraydatetime.datetime 对象。

版本 3.4 中的变化: 新的 API,旧的 API 已弃用。添加了对二进制格式 plist 的支持。

版本 3.8 中的变化: 添加了对读取和写入二进制 plist 中的 UID 令牌的支持,如 NSKeyedArchiver 和 NSKeyedUnarchiver 所使用的那样。

版本 3.9 中的变化: 旧的 API 已移除。

另请参阅

PList 手册页

Apple 公司关于文件格式的文档。

此模块定义了以下函数

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

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

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

dict_type 是用于从 plist 文件读取的字典的类型。

FMT_XML 格式的 XML 数据使用 xml.parsers.expat 中的 Expat 解析器进行解析 - 有关格式错误的 XML 可能引发的异常,请参阅其文档。未知元素将被 plist 解析器忽略。

当无法解析文件时,二进制格式的解析器会引发 InvalidFileException

3.4 版中添加。

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

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

3.4 版中添加。

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

value 写入 plist 文件。fp 应该是一个可写的二进制文件对象。

fmt 参数指定 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 格式的字节对象形式返回 value。有关此函数关键字参数的说明,请参阅 dump() 的文档。

3.4 版中添加。

以下类可用

class plistlib.UID(data)

包装一个 int。这在读取或写入包含 UID 的 NSKeyedArchiver 编码数据时使用(请参阅 PList 手册)。

它有一个属性 data,可用于检索 UID 的整数值。 data 必须在 0 <= data < 2**64 范围内。

在 3.8 版中添加。

以下常量可用

plistlib.FMT_XML

plist 文件的 XML 格式。

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"])