2016-07-16 64 views
2

私はPythonには初めてです。 pythonパッケージを使用してVCARD 2.1ファイルを解析しようとしています。python VObjectパッケージを使用してVCARDファイルを解析する際にエラーが発生しました

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' 

リンクについて:その後、私は次のエラーを取得しています

import vobject 
f=open('sample.vcf','r') 
vcf=vobject.readOne(f) 

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

これらはPythonの私が使用するコマンドです:
私はこのvCardファイルを解析しようとしていますエラーログhttps://paste.fedoraproject.org/391670/46866724/

Pyオブジェクトは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私を助けてください。今、私はこのエラーが、私はこのエラーを克服するための任意の少しハックを行うことができますのpython 3とvobjectの非互換性によるものであることを理解し を?

+0

を使用していますか? –

+0

@MartijnPietersはい – anapneo

+2

あなたは 'ENCODING = QUOTED-PRINTABLE'がどのように処理されるかのバグを発見したと思います。プロジェクトはPython 3で* Unicode strings *を読み込みますが、 'decode'メソッドが動作することを期待しています。私はhttps://github.com/eventable/vobject/issues/20は同じ問題だと思う。 –

答えて

1

質問には3つの問題があります。

まず:フィールド内のNあなたは逃した「:」

第二:vobjectはstricly話すが、それを必要としない2.1でのvCardのバージョン本家FNを必要とするようです。

は、第三次のファイルと

f=open(vcardfile,'r') 
    vcf=vobject.readOne(f) 

作品:代わりにreadOneの私は、あなたがreadComponentsを使用したいドント場合は、いずれの場合もvobject.readComponentsに

を使用してコードをお勧め:

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 

そして、あなたは出力を取得する必要がありますあなたはおそらく、Pythonの3を

<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 
関連する問題