【问题标题】:Error in parsing VCARD file using python VObject package使用 python VObject 包解析 VCARD 文件时出错
【发布时间】:2016-07-16 11:30:09
【问题描述】:

我是 python 新手。我正在尝试使用 vobject 0.9.2 python 包解析 VCARD 2.1 文件。
我正在尝试解析这个 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包源代码中的代码sn-p:

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 包正在尝试解码已经解码的字符串。所以我什至尝试将 vcf 文件转换为二进制字符串并将其作为输入提供给 vobject.readOne

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

但它不起作用。

我必须做什么才能成功解析VCARD 文件?
请有人帮助我...

编辑: 现在我知道这个错误是由于vobject 与 python 3 不兼容。我可以做一些小技巧来克服这个错误吗?

【问题讨论】:

  • 你可能在使用 Python 3 吗?
  • @MartijnPieters 是的
  • 我想你在ENCODING=QUOTED-PRINTABLE 的处理方式中发现了一个错误;该项目在 Python 3 上读取 Unicode 字符串,但希望 decode 方法能够正常工作。我认为github.com/eventable/vobject/issues/20 是同一个问题。

标签: python vcf-vcard quoted-printable vobject


【解决方案1】:

您的问题存在三个问题。

首先:在字段 N 中你错过了“:”

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

第三:我建议你使用 vobject.readComponents 代替 readOne

无论如何,如果您不想使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    相关资源
    最近更新 更多