1

If I import a vcard with vobject like this:

with open(some_file_containing_a_vcard,
                  "r" , encoding="utf-8") as fd:
            vcard_content = vobject.readOne(fd.read(),
                                            ignoreUnreadable=True)

How fo I get all telephone numbers or emails, if there are more than one provides by the vcard?

I only found:

vcard_content.tel.value
vcard_content.email.value

...but this only returns the first of each.

As I dived into the code, it seems the entities are created as clases. So a vcard's attribute "TEL" gets created as "tel". What, if I have a cell and a work phone number?

I am totally stuck :-)

Christian Rößner
  • 447
  • 1
  • 5
  • 18

3 Answers3

2

You can actually achieve this by using the contents attribute, which is a dictionary. So you would access a list of all TEL properties using something like

with open(path_to_vcard) as f:
    text = f.read()

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

which will print the list of all TEL properties (even if there is only one or none).

wpercy
  • 9,636
  • 4
  • 33
  • 45
1

I solved it with the following code snippet:

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()

This works for me :-)

Christian Rößner
  • 447
  • 1
  • 5
  • 18
0

There are attributes named tel_list and email_list that should provide the other entries you're looking for.

Elements in these lists act just like "tel" and "email", and each also has a .value and .type_param that you might want to check to disambiguate.

chronospoon
  • 510
  • 6
  • 14