pythonlistdictionaryvcf-vcard

Create vCard files from a list of dictionaries


ListDict=[
        
        {key1:val1, key2:val2, key3:val3, key4:val4, key5:val5}
        {key1:val6, key2:val7, key3:val8, key4:val9, key5:val10}
        {key1:val11, key2:val12, key3:val13, key4:val14, key5:val5}
        {key1:val16, key2:val17, key3:val18, key4:val19, key5:val20}
        {key1:val21, key2:val22, key3:val23, key4:val24, key5:val25}
        {key1:val26, key2:val27, key3:val28, key4:val29, key5:va30}
]

v = vobject.vCard()
v.add('cn').value = val1
v.add('n').value = val2
v.add('fn').value = val3
v.add('title').value = val4
v.add('email').value = val5
v.serialize()

I have a list of dictionaries, and i want to iterate inside the list and then inside each dictionary inside it, and my problem is to go to value the fields of each vCard files - thanks to the implementation of the vobject library that allow me to create a vCard. I would like to create a vCard by adding the data of each dictionary that is present in the list, but i don't how to do it, because each dictionary has the same key string, but each key of each dictionary has associated different value, that is, also in this case a string.

Someone can help me?


Solution

  • Try this:

    import vobject
    
    
    key1, key2, key3, key4, key5 = [i for i in range(5)]
    val1, val3, val4, val5 = [str(i) for i in range(5, 9)]
    val2 = '123 456'
    
    ListDict = [
        {key1: val1, key2: val2, key3: val3, key4: val4, key5: val5},
        {key1: val1, key2: val2, key3: val3, key4: val4, key5: val5},
        {key1: val1, key2: val2, key3: val3, key4: val4, key5: val5},
        {key1: val1, key2: val2, key3: val3, key4: val4, key5: val5},
        {key1: val1, key2: val2, key3: val3, key4: val4, key5: val5},
        {key1: val1, key2: val2, key3: val3, key4: val4, key5: val5},
    ]
    
    for line in ListDict:
        v = vobject.vCard()
        o = v.add('cn')
        o.value = line[key1]
    
        o = v.add('n')
        o.value = vobject.vcard.Name(
            family=line[key2].split()[-1],
            given=line[key2].split()[0]
        )
    
        o = v.add('fn')
        o.value = line[key3]
    
        o = v.add('title')
        o.value = line[key4]
    
        o = v.add('email')
        o.value = line[key5]
        print(v.serialize())
    

    Result:

    BEGIN:VCARD
    VERSION:3.0
    CN:5
    EMAIL:8
    FN:6
    N:456;123;;;
    TITLE:7
    END:VCARD
    
    BEGIN:VCARD
    VERSION:3.0
    CN:5
    EMAIL:8
    FN:6
    N:456;123;;;
    TITLE:7
    END:VCARD
    
    BEGIN:VCARD
    VERSION:3.0
    CN:5
    EMAIL:8
    FN:6
    N:456;123;;;
    TITLE:7
    END:VCARD
    
    BEGIN:VCARD
    VERSION:3.0
    CN:5
    EMAIL:8
    FN:6
    N:456;123;;;
    TITLE:7
    END:VCARD
    
    BEGIN:VCARD
    VERSION:3.0
    CN:5
    EMAIL:8
    FN:6
    N:456;123;;;
    TITLE:7
    END:VCARD
    
    BEGIN:VCARD
    VERSION:3.0
    CN:5
    EMAIL:8
    FN:6
    N:456;123;;;
    TITLE:7
    END:VCARD