2014-03-05 80 views
2

我正在嘗試使用python修改plist文件。我從我的圖書館複製了一個plist到我的桌面上以安全地播放它。我輸入osplistlib。我遵循我在documentation here中看到的內容。plistlib無法讀取Safari的plist文件

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

這不應該給你報告的錯誤。你可以[編輯]你的問題,包括**完整的追溯**? – mhlester

+0

而不是'x = readPlist(...'你試過'x = plistlib.readPlist(...'? – fredtantini

+0

@mhlester你是對的,我用真正的錯誤信息更新了它 – wetjosh

回答

10

的問題是,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' 
+0

我們走了。我使用了biplist選項。按預期工作。謝謝。 – wetjosh

0

不該」它是x = plistlib.readPlist(os.path.expanduser(test_prefs))

+0

請看上面的評論@Claudiu – wetjosh

+0

當時它確實回答了這個問題,但問題已被修改。 – pxul

0

這條線:

import plistlib 

創建一個命名空間plistlib,其中存儲的所有對象,爲了從重挫自己的變量名保留。

要訪問功能readPlist,你需要使用點符號訪問plistlib.readPlist

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

作爲替代方案,你可以使用這個語法來使您需要爲您的全球空間是什麼:

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

請參閱上面的評論@Claudiu – wetjosh

+0

您需要編輯您的問題與**完全回溯**您收到的錯誤 – mhlester

+0

我更新了問題 – wetjosh