我正在尝试使用python修改plist文件。我将一个plist从我的库中复制到我的桌面上,以便安全地玩它。我已导入os
和plistlib
。我正在关注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
答案 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...