【发布时间】:2016-07-16 11:30:09
【问题描述】:
我是 python 新手。我正在尝试使用 vobject 0.9.2 python 包解析 VCARD 2.1 文件。
我正在尝试解析这个 VCARD 文件:
BEGIN:VCARD
VERSION:2.1
N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:I;AM;DUMMY;;
TEL;CELL:123456789
END:VCARD
这些是我使用的python命令:
import vobject
f=open('sample.vcf','r')
vcf=vobject.readOne(f)
然后我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files\Anaconda3\lib\site-packages\vobject\base.py", line 1129, in readOne
allowQP))
File "C:\Program Files\Anaconda3\lib\site-packages\vobject\base.py", line 1073, in readComponents
vline = textLineToContentLine(line, n)
File "C:\Program Files\Anaconda3\lib\site-packages\vobject\base.py", line 912, in textLineToContentLine
'lineNumber' : n})
File "C:\Program Files\Anaconda3\lib\site-packages\vobject\base.py", line 336, in __init__
self.value = self.value.decode('quoted-printable')
AttributeError: 'str' object has no attribute 'decode'
错误日志链接https://paste.fedoraproject.org/391670/46866724/
Python 显示str 对象没有decode 属性。
这是发生错误的vobject包源代码中的代码sn-p:
if 'ENCODING' in self.params:
if 'QUOTED-PRINTABLE' in self.params['ENCODING']:
qp = True
self.params['ENCODING'].remove('QUOTED-PRINTABLE')
if 0==len(self.params['ENCODING']):
del self.params['ENCODING']
if 'QUOTED-PRINTABLE' in self.singletonparams:
qp = True
self.singletonparams.remove('QUOTED-PRINTABLE')
if qp:
self.value = self.value.decode('quoted-printable')
通过阅读 stackoverflow 中的类似问题,我了解到 vobject 包正在尝试解码已经解码的字符串。所以我什至尝试将 vcf 文件转换为二进制字符串并将其作为输入提供给 vobject.readOne。
binstr = f.read('sample.vcf','r').encode('utf-8')
x=vobject.readOne(binstr)
但它不起作用。
我必须做什么才能成功解析VCARD 文件?
请有人帮助我...
编辑:
现在我知道这个错误是由于vobject 与 python 3 不兼容。我可以做一些小技巧来克服这个错误吗?
【问题讨论】:
-
你可能在使用 Python 3 吗?
-
@MartijnPieters 是的
-
我想你在
ENCODING=QUOTED-PRINTABLE的处理方式中发现了一个错误;该项目在 Python 3 上读取 Unicode 字符串,但希望decode方法能够正常工作。我认为github.com/eventable/vobject/issues/20 是同一个问题。
标签: python vcf-vcard quoted-printable vobject