plistlib无法读取Safari的plist文件

时间:2014-03-05 23:30:02

标签: python plist

我正在尝试使用python修改plist文件。我将一个plist从我的库中复制到我的桌面上,以便安全地玩它。我已导入osplistlib。我正在关注documentation here中的内容。

import plistlib
import os

test_prefs = "~/Desktop/com.apple.Safari.plist"

x = readPlist(os.path.expanduser(test_prefs))
print x["TopSitesGridArrangement"]

但这失败了。我做错了什么?

我得到的确切错误:

Traceback (most recent call last):
  File "/Users/Josh/Desktop/destroy.py", line 11, in <module>
    x = readPlist(os.path.expanduser(test_prefs))
NameError: name 'readPlist' is not defined

当我将其更改为x = plistlib.readPlist(os.path.expanduser(test_prefs))时,我得到的错误如下(我的文件名称为destroy.py):

Traceback (most recent call last):
  File "/Users/Josh/Desktop/destroy.py", line 11, in <module>
    x = plistlib.readPlist(os.path.expanduser(test_prefs))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plistlib.py", line 78, in readPlist
    rootObject = p.parse(pathOrFile)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plistlib.py", line 406, in parse
    parser.ParseFile(fileobj)
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 8

3 个答案:

答案 0 :(得分:12)

问题是Safari的plist文件实际上是二进制plist文件格式,内置plistlib无法读取。但是,biplist可以读取这些文件(需要安装):

>>> import biplist
>>> x = biplist.readPlist("com.apple.Safari.plist")
>>> x['LastOSVersionSafariWasLaunchedOn']
'10.9.1'

或者,您可以使用plutil首先将二进制plist格式转换为xml格式,然后使用plistlib读取它:

$ plutil -convert xml1 com.apple.Safari.plist
$ python
>>> import plistlib
>>> x = plistlib.readPlist("com.apple.Safari.plist")
>>> x['LastOSVersionSafariWasLaunchedOn']
'10.9.1'

答案 1 :(得分:0)

不应该是x = plistlib.readPlist(os.path.expanduser(test_prefs))吗?

答案 2 :(得分:0)

这一行:

import plistlib

创建一个名称空间plistlib,其中存储了所有对象,以防止破坏自己的变量名。

要访问功能readPlist,您需要使用点号来访问plistlib.readPlist

x = plistlib.readPlist(os.path.expanduser(test_prefs))

作为替代方案,您可以使用此语法将您需要的内容带入全局空间:

from plistlib import readPlist, writePlist  # and anything else...