Python 的 plistlib 模块:Apple .plist 文件处理全解
在 Python 编程中,处理不同格式的数据文件是常见任务。plistlib模块为处理 Apple 的.plist文件提供了强大支持,.plist文件广泛应用于 macOS 和 iOS 系统。本文将详细讲解plistlib模块的功能、用法,包括文件的读取与写入、数据类型支持、相关类和常量的使用,同时通过实际示例和对比分析,帮助读者深入理解并熟练运用该模块。
文章目录
一、plistlib模块基础认知
plistlib模块是 Python 标准库的一部分,其源代码位于Lib/plistlib.py。它主要用于生成和解析 Apple 的 “property list” 文件(即.plist文件)。.plist文件是一种简单的序列化格式,常用于存储和交换数据,支持多种基本对象类型,如字典、列表、数字、字符串等,通常将字典作为最高层级对象。该模块同时支持二进制和 XML 格式的.plist文件,为开发者在处理相关数据时提供了极大便利。
二、核心函数详解
(一)读取函数
plistlib.load(fp, \*, fmt=None, dict_type=dict):用于读取.plist文件。fp必须是一个可读的二进制文件对象。fmt参数用于指定文件格式,None表示自动检测,FMT_XML代表 XML 文件格式,FMT_BINARY代表二进制格式。dict_type指定从文件读取数据时使用的字典类型。当使用FMT_XML格式时,内部会使用xml.parsers.expat的 Expat 解析器,格式错误的 XML 可能引发相应异常,未知元素会被解析器直接忽略;二进制格式解析时,若文件无法解析则会引发InvalidFileException异常。例如:
import plistlib
try:
with open('example.plist', 'rb') as f:
data = plistlib.load(f)
print(data)
except FileNotFoundError:
print('文件不存在')
except plistlib.InvalidFileException as e:
print(f'文件解析错误: {e}')
plistlib.loads(data, \*, fmt=None, dict_type=dict):从字节对象中加载.plist数据,参数含义与load函数相同。例如:
import plistlib
plist_bytes = b'<?xml version="1.0" encoding="UTF-8"?><plist version="1.0"><dict><key>name</key><string>John</string></dict></plist>'
try:
data = plistlib.loads(plist_bytes)
print(data['name'])
except plistlib.InvalidFileException as e:
print(f'数据解析错误: {e}')
(二)写入函数
plistlib.dump(value, fp, \*, fmt=FMT_XML, sort_keys=True, skipkeys=False):将数据写入.plist文件。value是要写入的数据,fp是可写的二进制文件对象。fmt指定文件格式,默认为FMT_XML。sort_keys为True时,字典的键会在写入前排序;skipkeys为False时,若字典键不是字符串会引发TypeError,为True时则跳过这些键。如果对象类型不受支持或包含不受支持的类型,会引发TypeError;对于无法在(二进制).plist文件中表示的整数值,会引发OverflowError。例如:
import plistlib
data = {'name': 'Alice', 'age': 30}
with open('output.plist', 'wb') as f:
try:
plistlib.dump(data, f)
except TypeError as e:
print(f'数据类型错误: {e}')
except OverflowError as e:
print(f'整数值溢出错误: {e}')
plistlib.dumps(value, \*, fmt=FMT_XML, sort_keys=True, skipkeys=False):将数据转换为.plist格式的字节串对象返回,参数与dump函数一致。例如:
import plistlib
data = {'message': 'Hello, World!'}
plist_bytes = plistlib.dumps(data)
print(plist_bytes)
三、数据类型支持
plistlib支持多种数据类型,具体如下:
| Python 数据类型 | 是否支持 | 说明 |
|---|---|---|
| 字符串 | 是 | 可直接存储和读取 |
| 整数 | 是 | 注意取值范围,超出(二进制).plist文件表示范围会引发OverflowError |
| 浮点数 | 是 | 正常支持 |
| 布尔值 | 是 | True和False可正确处理 |
| 元组 | 是 | 会被转换为列表存储 |
| 列表 | 是 | 支持嵌套列表 |
| 字典 | 是 | 键必须为字符串,否则根据skipkeys参数处理 |
bytes | 是 | 支持二进制数据存储 |
bytearray | 是 | 会被转换为bytes存储 |
datetime.datetime | 是 | 可存储日期和时间信息 |
plistlib.UID | 是 | 用于处理 NSKeyedArchiver 编码数据中的 UID,包装一个int,取值范围0 <= data < 2**64 |
四、相关类和常量
(一)类
class plistlib.UID(data):用于包装一个int,在读取或写入 NSKeyedArchiver 编码的数据时使用,包含一个属性data,可提取 UID 的整数值,data的取值范围为0 <= data < 2**64。例如:
import plistlib
uid = plistlib.UID(12345)
print(uid.data)
(二)常量
plistlib.FMT_XML:表示.plist文件的 XML 格式,用于在读取和写入函数中指定格式。plistlib.FMT_BINARY:表示.plist文件的二进制格式,同样用于指定文件格式。
五、实际应用示例
(一)生成复杂.plist文件
import datetime
import plistlib
data = {
'aString': 'Doodah',
'aList': ['A', 'B', 12, 32.1, [1, 2, 3]],
'aFloat': 0.1,
'anInt': 728,
'aDict': {
'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()
}
with open('complex.plist', 'wb') as f:
plistlib.dump(data, f)
(二)解析 XML 格式.plist文件
import plistlib
with open('example.xml', 'rb') as f:
data = plistlib.load(f, fmt=plistlib.FMT_XML)
print(data)
总结
plistlib模块为 Python 开发者提供了高效处理 Apple .plist文件的能力,通过其丰富的函数、支持的数据类型以及相关类和常量,能够轻松实现.plist文件的读取、写入和数据转换。在涉及 macOS 和 iOS 开发、数据交换等场景中,合理运用plistlib模块可以提高开发效率,确保数据的正确处理和存储。
TAG: Python;plistlib;.plist 文件;数据处理;Apple 开发
相关学习资源
- Python 官方文档 - plistlib 模块:https://docs.python.org/zh-cn/3.12/library/plistlib.html,这是最权威的资料,详细介绍了模块的函数、类、常量及用法示例,适合深入学习和查阅。
- PList 指南页面:Apple 官方针对
.plist文件格式的文档,可深入了解.plist文件的规范和应用场景,帮助更好地理解plistlib模块的使用,网址需在 Apple 开发者文档中查找。 - Tekin的Python编程秘籍库: Python 实用知识与技巧分享,涵盖基础、爬虫、数据分析等干货 本 Python 专栏聚焦实用知识,深入剖析基础语法、数据结构。分享爬虫、数据分析等热门领域实战技巧,辅以代码示例。无论新手入门还是进阶提升,都能在此收获满满干货,快速掌握 Python 编程精髓。
1005

被折叠的 条评论
为什么被折叠?



