Python 3.4 plistlib不起作用(str vs bytes错误)

时间:2015-07-05 18:54:20

标签: python-3.x

所以,我开始了一个新的玩具项目,并决定我第一次使用Python 3 ......

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
嗯,好的,我们给它一个提示:

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?

我想知道我是否决定尝试使用2.7以上的Python 3只是为了证明自虐和毫无意义......

哦,是的,实际问题:是否可以在Python 3.4.3中使用plistlib打开XML plist文件?

肯定我在这里遗漏了一些明显的东西......只是注意到plistlib的Py2版本(有效!)有一个不同的界面,所以有人实际修改了库的代码以包含在Py3中...

2 个答案:

答案 0 :(得分:3)

感谢@J Presper Eckert给我一个关于要寻找什么的线索......

然后我发现了这篇文章:
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html#the-binary-option

这表明答案只是以二进制模式打开文件,尝试过它就可以了!

with open("/Volumes/Thunderbay/CURRENT/Music/iTunes/iTunes Library.xml", 'rb') as itl:
    library = plistlib.load(itl)

答案 1 :(得分:-1)

使用python 3.4.3对.plist文件(mac属性列表,xml中的配置文件)获得相同的错误消息。

试试这个(为我工作):

  1. 将plist / xml文件复制到新文件。
  2. 将新文件扩展名更改为&#39; .txt&#39;
  3. 在textEdit(mac),notepad ++(win)或类似内容中打开newfile.txt
  4. 使用UTF-8编码保存为.txt文件&amp;只有明文。
  5. 现在,当你阅读newfile.txt时,你不会看到&#34; startwith first arg必须是str或str的元组,而不是字节&#34;。

    干杯