2015-07-05 44 views
2

於是,我開始一個新的玩具項目,並決定我會使用Python 3,第一次......的Python 3.4 plistlib不起作用(STR VS字節錯誤)

In [1]: import plistlib 

In [2]: with open("/Volumes/Thunderbay/CURRENT/Music/iTunes/iTunes Library.xml") as itl: 
    library = plistlib.load(itl) 
    ...: 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-3-6459a022cb71> in <module>() 
     1 with open("/Volumes/Thunderbay/CURRENT/Music/iTunes/iTunes Library.xml") as itl: 
----> 2  library = plistlib.load(itl) 
     3 

/usr/local/Cellar/python3/3.4.3_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plistlib.py in load(fp, fmt, use_builtin_types, dict_type) 
    984   fp.seek(0) 
    985   for info in _FORMATS.values(): 
--> 986    if info['detect'](header): 
    987     P = info['parser'] 
    988     break 

/usr/local/Cellar/python3/3.4.3_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plistlib.py in _is_fmt_xml(header) 
    556 
    557  for pfx in prefixes: 
--> 558   if header.startswith(pfx): 
    559    return True 
    560 

TypeError: startswith first arg must be str or a tuple of str, not bytes 

嗯ok了,讓我們給它一個提示:

In [3]: with open("/Volumes/Thunderbay/CURRENT/Music/iTunes/iTunes Library.xml") as itl: 
    library = plistlib.load(itl, fmt=plistlib.FMT_XML) 
    ...: 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-4-ef5f06b44ec2> in <module>() 
     1 with open("/Volumes/Thunderbay/CURRENT/Music/iTunes/iTunes Library.xml") as itl: 
----> 2  library = plistlib.load(itl, fmt=plistlib.FMT_XML) 
     3 

/usr/local/Cellar/python3/3.4.3_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plistlib.py in load(fp, fmt, use_builtin_types, dict_type) 
    995 
    996  p = P(use_builtin_types=use_builtin_types, dict_type=dict_type) 
--> 997  return p.parse(fp) 
    998 
    999 

/usr/local/Cellar/python3/3.4.3_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plistlib.py in parse(self, fileobj) 
    323   self.parser.EndElementHandler = self.handle_end_element 
    324   self.parser.CharacterDataHandler = self.handle_data 
--> 325   self.parser.ParseFile(fileobj) 
    326   return self.root 
    327 

TypeError: read() did not return a bytes object (type=str) 

plistlib是在standard library,但是從以上問題我有感覺它實際上並沒有轉換到Python 3?

我想知道如果我決定嘗試Python 3的270多隻是要證明自虐和毫無意義的...

哦,是的,實際的問題:是否有可能在打開與plistlib一個XML plist文件Python 3.4.3?

當然我在這裏可能丟失了一些很明顯的東西......剛注意到plistlib(它工作!)的Py2版本有不同的接口,所以有人實際上修改了庫的代碼以包含在Py3中。

+0

當你用textmode打開你的文件時它工作嗎? '打開(「/ Volumes/..」,mode ='rt')...'......嗯可能不會,這應該是默認的。 –

+0

@hiroprotagonist謝謝,我曾試過,但同樣的錯誤 – Anentropic

回答

-1

使用python 3.4.3針對.plist文件(mac屬性列表,配置文件在xml中),得到了相同的錯誤消息。

試試這個(工作對我來說):

  1. 複製的plist/xml文件到新的文件。
  2. 變化的新的文件擴展名 '.TXT'
  3. 開放newfile.txt在文本編輯(MAC),記事本++(WIN)或類似
  4. 保存爲UTF-8編碼&明文僅.txt文件。

現在,當您讀取newfile.txt時,您將看不到「startswith first arg必須是str或str的元組,而不是字節」。

乾杯

相關問題