2016-07-16 22 views
2

Я новичок в python. Я пытаюсь разобрать VCARD 2.1 файл с помощью vobject 0.9.2 пакета python.
Я пытаюсь разобрать этот VCARD файл:Ошибка в анализе файла VCARD с использованием пакета python VObject

BEGIN:VCARD 
VERSION:2.1 
N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:I;AM;DUMMY;; 
TEL;CELL:123456789 
END:VCARD 

Таков питон команда, которые я использовал:

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/

Py thon показывает, что 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') 

Читая подобные проблемы в StackOverflow Я понимаю, что vobject пакет пытается декодировать уже декодируется string.So я даже пытался преобразование файла vcf в двоичную строку и предоставление этого в качестве значения vobject.readOne.

binstr = f.read('sample.vcf','r').encode('utf-8') 
x=vobject.readOne(binstr) 

но он не работает.

Что мне нужно сделать, чтобы успешно разобрать VCARD файл?
Пожалуйста, кто-нибудь мне помочь ...

EDIT: Теперь я понимаю, что эта ошибка происходит из-за несовместимости vobject с питоном 3. Могу ли я сделать любой маленький хак, чтобы преодолеть эту ошибку?

+0

Вы используете Python 3, возможно? –

+0

@MartijnPieters yes – anapneo

+2

Я думаю, вы обнаружили ошибку в том, как обрабатывается 'ENCODING = QUOTED-PRINTABLE'; проект читает * строки Unicode * на Python 3, но ожидает, что метод 'decode' будет работать. Я думаю, что https://github.com/eventable/vobject/issues/20 - та же проблема. –

ответ

1

Есть три вопроса с вашим вопросом.

Во-первых: в поле N вы пропустили «:»

Второе: vobject, кажется, требует FN Eventhough ваша версия VCard является 2,1, который stricly говоря, не требует.

Третье: вместо 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