首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python vobject获取vcard中属性的所有值

使用python vobject获取vcard中属性的所有值
EN

Stack Overflow用户
提问于 2017-02-01 17:21:18
回答 3查看 865关注 0票数 1

如果我使用vobject导入一个vcard,如下所示:

代码语言:javascript
复制
with open(some_file_containing_a_vcard,
                  "r" , encoding="utf-8") as fd:
            vcard_content = vobject.readOne(fd.read(),
                                            ignoreUnreadable=True)

如果vcard提供了多个电话号码或电子邮件,我如何获得所有电话号码或电子邮件?

我只找到了:

代码语言:javascript
复制
vcard_content.tel.value
vcard_content.email.value

...but这只返回其中的第一个。

当我深入研究代码时,似乎实体是作为类创建的。因此,vcard的属性"tel“被创建为"TEL”。如果我有一个手机和一个工作电话号码?

我完全卡住了:-)

EN

回答 3

Stack Overflow用户

发布于 2017-06-23 06:29:37

您实际上可以通过使用contents属性来实现这一点,该属性是一个字典。因此,您可以使用下面的命令访问所有TEL属性的列表

代码语言:javascript
复制
with open(path_to_vcard) as f:
    text = f.read()

card = vobject.readOne(text)
print card.contents['tel']

它将打印所有TEL属性的列表(即使只有一个或没有)。

票数 2
EN

Stack Overflow用户

发布于 2017-02-02 05:46:21

我用下面的代码片段解决了这个问题:

代码语言:javascript
复制
stream = io.open(some_file_containing_a_vcard, "r", encoding="utf-8")
vcf = vobject.readComponents(stream, ignoreUnreadable=True)

for child in vcard.getChildren():
    name = child.name.lower()
    value = child.value
    attribs = child.params.get("TYPE", [])

    filtered_type = [x.lower() for x in attribs if x.lower() in (
                        "work", "home", "cell", "fax"
                    )]
    if len(filtered_type) == 0:
        filtered_type = ["unspec"]

    # Do something with it... i.e. adding to a dict()

stream.close()

这对我很有效:-)

票数 1
EN

Stack Overflow用户

发布于 2021-08-17 06:37:11

名为tel_listemail_list的属性应该可以提供您正在查找的其他条目。

这些列表中的元素的行为类似于"tel“和"email",并且每个元素都有一个您可能想要检查以消除歧义的.value.type_param

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41976013

复制
相关文章

相似问题

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