在 Python 中解析 plist 文件

Posted

技术标签:

【中文标题】在 Python 中解析 plist 文件【英文标题】:Parse plist file in Python 【发布时间】:2016-06-21 21:41:39 【问题描述】:

我的 Python 代码有问题。我有一个 plist 文件。

Info.plist

<plist>
  <dict>
    <key>Apple Car Version</key>
    <string>1.0</string>
    <key>Last Backup Date</key>
    <date/>
    <key>Product Type</key>
    <string>iPad2,5</string>
    <key>Product Version</key>
    <string>9.3.1</string>
  </dict>
</plist>

我的 Python 代码

import os
import plistlib

def main():

   fileName=os.path.expanduser('Info.plist')

   if os.path.exists(fileName):

      pl=plistlib.readPlist(fileName)

      if 'Product Version' in pl:
         print( 'The aString value is %s\n' % pl['Apple Car Version'])

      else:
         print( 'There is no Apple Car Version in the plist\n')

   else:
      print( '%s does not exist, so can\'t be read' % fileName)

if __name__ == '__main__':
   main()

好的,所以我写了一些代码,但我现在面临更大的问题,我发现这不是我的代码,而是我的 plist plist 中的最后备份日期导致错误。有没有办法让我只能解析字符串,没有别的像&lt;date/&gt;

顺便说一下,如果您想知道这个 plist 是由 iTunes 制作的

【问题讨论】:

【参考方案1】:

那个 plist 文件根本不是格式良好的 xml,所以我怀疑它会起作用。我认为你需要(至少)一个根 plist 元素和一个 dict 包装器:

<plist>
  <dict>
    <key>Apple Car Version</key>
    <string>1.0</string>
  </dict>
</plist>

那么pl 的键将是您在文件中实际定义的键,因此在这种情况下为“Apple Car Version”:

print(pl['Apple Car Version'])

【讨论】:

有关 plist 文件格式的更多详细信息,另请参阅 plist(5) developer.apple.com/legacy/library/documentation/Darwin/… 好的,我更新了答案,出现语法错误:NameError: name 'load' is not defined ,我需要导入其他模块吗? 好的,所以我写了一些代码,但我现在面临更大的问题,我发现这不是我的代码,而是我的 plist plist 中的最后备份日期导致错误。有没有办法让我只能解析字符串,而不是像 我不认为一个空日期在 plist 中是有效的......我认为约定是如果它的值为 null 则完全省略键。在任何情况下,plistlib 都不支持它,如您所见,它将尝试解析整个文件,如果日期为空,则会失败。如果您需要从文件中提取部分内容,并且愿意放弃与二进制 plist 格式的兼容性,则可以使用任何 python xml 解析器直接从 xml 中获取您需要的内容。 [docs.python.org/3/library/xml.html]

以上是关于在 Python 中解析 plist 文件的主要内容,如果未能解决你的问题,请参考以下文章

带有plist链接的href无法在python应用程序中解析

Android解析Plist文件

Android plist xml解析问题

解析 plist 文件并获取键的值

Java解析plist文件

在android中解析一个plist并在列表视图中显示数据