plistlib
— 生成和解析 Apple .plist
文件¶
源代码: Lib/plistlib.py
此模块提供了一个用于读取和写入 Apple 公司使用的“属性列表”文件的接口,主要用于 macOS 和 iOS。此模块支持二进制和 XML plist 文件。
属性列表 (.plist
) 文件格式是一种简单的序列化格式,支持基本对象类型,如字典、列表、数字和字符串。通常,顶级对象是一个字典。
要写入和解析 plist 文件,请使用 dump()
和 load()
函数。
要处理字节对象中的 plist 数据,请使用 dumps()
和 loads()
。
值可以是字符串、整数、浮点数、布尔值、元组、列表、字典(但只能使用字符串键)、bytes
、bytearray
或 datetime.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 是文件的格式,以下值有效
None
:自动检测文件格式FMT_XML
:XML 文件格式FMT_BINARY
:二进制 plist 格式
dict_type 是用于从 plist 文件读取的字典的类型。
FMT_XML
格式的 XML 数据使用xml.parsers.expat
中的 Expat 解析器进行解析 - 有关格式错误的 XML 可能引发的异常,请参阅其文档。未知元素将被 plist 解析器忽略。当无法解析文件时,二进制格式的解析器会引发
InvalidFileException
。3.4 版中添加。
- plistlib.dump(value, fp, *, fmt=FMT_XML, sort_keys=True, skipkeys=False)¶
将 value 写入 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 格式的字节对象形式返回 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"])