Ошибка разбора файла 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
Другие вопросы по тегам