使用 python VObject 包解析 VCARD 文件时出错
Error in parsing VCARD file using python VObject package
我是 python.I 的新手,我正在尝试使用 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'
link 用于错误日志 https://paste.fedoraproject.org/391670/46866724/
Python 表示 str
对象没有属性 decode
。
这里是vobject包源代码中出现错误的代码片段:
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')
通过阅读 Whosebug 中的类似问题,我了解到 vobject 包正在尝试解码已经解码的 string.So 我什至尝试将 vcf 文件转换为二进制字符串并将其作为 vobject.readOne
的输入。
binstr = f.read('sample.vcf','r').encode('utf-8')
x=vobject.readOne(binstr)
但它不起作用。
我需要做什么才能成功解析 VCARD
文件?
请有人帮助我...
编辑:
现在我明白这个错误是由于 vobject
与 python 不兼容造成的 3. 我可以做一些小技巧来克服这个错误吗?
你的问题存在三个问题。
第一个:在字段 N 你错过了“:”
其次:vobject 似乎需要 FN,尽管您的 vcard 版本是 2.1,严格来说不需要它。
第三:我建议你使用 vobject.readComponents
而不是 readOne
无论如何,如果您不想使用 readComponents,您的代码:
f=open(vcardfile,'r')
vcf=vobject.readOne(f)
适用于以下文件:
BEGIN:VCARD
VERSION:2.1
N:;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:I;AM;DUMMY;;
FN:;;;;
TEL;TYPE=CELL:123456789
END:VCARD
以下代码也适用于上述文件:
#!/usr/bin/env python3
import vobject
vcardfile='/Users/foo/bar/abovefile.vcf'
with open(vcardfile) as source_file:
vcardlist = vobject.readComponents(source_file)
for vcard in vcardlist:
print vcard
print vcard.serialize()
print vcard.prettyPrint
你应该得到输出:
<VCARD| [<VERSION{}2.1>, <FN{};;;;>, <N{}AM ENCODING=QUOTED-PRINTABLE CHARSET=UTF-8:I DUMMY>, <TEL{'TYPE': ['CELL']}123456789>]>
BEGIN:VCARD
VERSION:2.1
FN:\;\;\;\;
N:;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:I;AM;DUMMY
TEL;TYPE=CELL:123456789
END:VCARD
VCARD
VERSION: 2.1
TEL: 123456789
params for TEL:
TYPE ['CELL']
FN: ;;;;
N: AM ENCODING=QUOTED-PRINTABLE CHARSET=UTF-8:I DUMMY
我是 python.I 的新手,我正在尝试使用 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'
link 用于错误日志 https://paste.fedoraproject.org/391670/46866724/
Python 表示 str
对象没有属性 decode
。
这里是vobject包源代码中出现错误的代码片段:
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')
通过阅读 Whosebug 中的类似问题,我了解到 vobject 包正在尝试解码已经解码的 string.So 我什至尝试将 vcf 文件转换为二进制字符串并将其作为 vobject.readOne
的输入。
binstr = f.read('sample.vcf','r').encode('utf-8')
x=vobject.readOne(binstr)
但它不起作用。
我需要做什么才能成功解析 VCARD
文件?
请有人帮助我...
编辑:
现在我明白这个错误是由于 vobject
与 python 不兼容造成的 3. 我可以做一些小技巧来克服这个错误吗?
你的问题存在三个问题。
第一个:在字段 N 你错过了“:”
其次:vobject 似乎需要 FN,尽管您的 vcard 版本是 2.1,严格来说不需要它。
第三:我建议你使用 vobject.readComponents
而不是 readOne无论如何,如果您不想使用 readComponents,您的代码:
f=open(vcardfile,'r')
vcf=vobject.readOne(f)
适用于以下文件:
BEGIN:VCARD
VERSION:2.1
N:;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:I;AM;DUMMY;;
FN:;;;;
TEL;TYPE=CELL:123456789
END:VCARD
以下代码也适用于上述文件:
#!/usr/bin/env python3
import vobject
vcardfile='/Users/foo/bar/abovefile.vcf'
with open(vcardfile) as source_file:
vcardlist = vobject.readComponents(source_file)
for vcard in vcardlist:
print vcard
print vcard.serialize()
print vcard.prettyPrint
你应该得到输出:
<VCARD| [<VERSION{}2.1>, <FN{};;;;>, <N{}AM ENCODING=QUOTED-PRINTABLE CHARSET=UTF-8:I DUMMY>, <TEL{'TYPE': ['CELL']}123456789>]>
BEGIN:VCARD
VERSION:2.1
FN:\;\;\;\;
N:;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:I;AM;DUMMY
TEL;TYPE=CELL:123456789
END:VCARD
VCARD
VERSION: 2.1
TEL: 123456789
params for TEL:
TYPE ['CELL']
FN: ;;;;
N: AM ENCODING=QUOTED-PRINTABLE CHARSET=UTF-8:I DUMMY