首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python VObject包解析VCARD文件时出错

使用python VObject包解析VCARD文件时出错
EN

Stack Overflow用户
提问于 2016-07-16 11:30:09
回答 1查看 2.2K关注 0票数 2

我对python还不熟悉,我正在尝试使用VCARD 2.1 package解析vobject 0.9.2文件。

我试图解析这个VCARD文件:

代码语言:javascript
复制
BEGIN:VCARD   
VERSION:2.1  
N;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:I;AM;DUMMY;;  
TEL;CELL:123456789   
END:VCARD  

下面是我使用的python命令:

代码语言:javascript
复制
import vobject
f=open('sample.vcf','r')
vcf=vobject.readOne(f)  

然后,我将得到以下错误:

代码语言:javascript
复制
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包源代码中出现错误的代码片段:

代码语言:javascript
复制
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')   

通过阅读堆栈溢出中的类似问题,我了解到vobject包正在试图解码已经解码的string.So,我甚至尝试将vcf文件转换为二进制字符串,并将其作为vobject.readOne的输入。

代码语言:javascript
复制
binstr = f.read('sample.vcf','r').encode('utf-8')
x=vobject.readOne(binstr)

但这是行不通的。

要成功解析VCARD文件,我必须做些什么?

谁来帮帮我..。

编辑:现在我明白了,这个错误是由于vobject和python 3不兼容造成的。我能做点什么来克服这个错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-10 03:10:46

你的问题有三个问题。

第一:在战场上你错过了“:

第二: vobject似乎需要FN,尽管您的vcard版本是2.1,严格地说,这并不需要它。

第三:我建议您不要使用readOne,而是使用vobject.readComponents

无论如何,如果您不想使用readComponents,您的代码:

代码语言:javascript
复制
    f=open(vcardfile,'r')
    vcf=vobject.readOne(f)

与以下文件一起工作:

代码语言:javascript
复制
    BEGIN:VCARD
    VERSION:2.1
    N:;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:I;AM;DUMMY;;
    FN:;;;;
    TEL;TYPE=CELL:123456789
    END:VCARD

以下代码也适用于上述文件:

代码语言:javascript
复制
    #!/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

你应该得到输出:

代码语言:javascript
复制
    <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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38410742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档