Получить все значения для атрибута в vcard, используя python vobject

Если я импортирую vcard с vobject, как это:

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

Как я могу получить все телефонные номера или электронные письма, если vcard предоставляет более одного номера?

Я только нашел:

vcard_content.tel.value
vcard_content.email.value

... но это возвращает только первый из каждого.

Когда я углубился в код, кажется, что сущности создаются как предложения. Таким образом, атрибут vcard "TEL" создается как "tel". Что, если у меня есть сотовый и рабочий номер телефона?

Я полностью застрял:-)

3 ответа

Вы действительно можете достичь этого, используя contents атрибут, который является словарем. Таким образом, вы получите доступ к списку всех свойств TEL, используя что-то вроде

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

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

который напечатает список всех свойств TEL (даже если есть только одно или ни одного).

Я решил это с помощью следующего фрагмента кода:

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

Это работает для меня:-)

Есть атрибуты с именем tel_list и email_list это должно предоставить другие записи, которые вы ищете.

Элементы в этих списках действуют так же, как «тел» и «электронная почта», и у каждого также есть .value и .type_param что вы, возможно, захотите проверить, чтобы устранить неоднозначность.

Другие вопросы по тегам