Ошибка разбора файла VCARD с использованием пакета Python VObject
Я новичок в Python. Я пытаюсь разобрать VCARD 2.1
использование файла vobject 0.9.2
пакет Python.
Я пытаюсь проанализировать этот файл 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, где происходит ошибка:
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')
Читая похожие проблемы в stackru, я понимаю, что пакет vobject пытается декодировать уже декодированную строку. Так что я даже попытался преобразовать файл vcf в двоичную строку и выдать его в качестве входных данных для vobject.readOne
,
binstr = f.read('sample.vcf','r').encode('utf-8')
x=vobject.readOne(binstr)
Но это не работает.
Что я должен сделать, чтобы успешно разобрать VCARD
файл?
Пожалуйста, кто-нибудь, помогите мне...
РЕДАКТИРОВАТЬ: Теперь я понимаю, что эта ошибка из-за несовместимости vobject
с питоном 3. Могу ли я сделать небольшой взлом, чтобы преодолеть эту ошибку?
1 ответ
Есть три вопроса с вашим вопросом.
Первое: в поле N вы пропустили ":"
Второе: vobject, кажется, требует FN, хотя ваша версия vcard 2.1, что строго говоря, не требует этого.
Третье: вместо readOne я предлагаю вам использовать vobject.readComponents
В любом случае, если вы не хотите использовать 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