5 Best Ways to Convert Python CSV to vCard

πŸ’‘ Problem Formulation: In this article, we explore how to convert a CSV file, loaded with contact information, into the vCard format using Python. This is particularly useful for exporting data from spreadsheets and databases to be used in contact management applications. An example input would be a CSV file containing names, phone numbers, and emails, and the desired output would be a .vcf file that can be imported into email or phone contact lists.

Method 1: Using the vobject Library

This method involves leveraging the powerful vobject library in Python, which provides tools for parsing and generating vCard and iCalendar files. The advantage of using vobject is that it simplifies the process of vCard creation by providing a high-level abstraction over the underlying vCard format.

Here’s an example:

import csv
import vobject

with open('contacts.csv', 'r') as csv_file, open('contacts.vcf', 'w') as vcf_file:
    reader = csv.reader(csv_file)
    for name, phone, email in reader:
        vcard = vobject.vCard()
        vcard.add('n')
        vcard.n.value = vobject.vcard.Name(family=name.split()[1], given=name.split()[0])
        vcard.add('fn')
        vcard.fn.value = name
        vcard.add('tel')
        vcard.tel.value = phone
        vcard.add('email')
        vcard.email.value = email
        vcf_file.write(vcard.serialize())

The output will be a .vcf file with all your contacts formatted as individual vCards.

This snippet opens a CSV file and reads through each entry, creating a new vCard for each row in the file and adding the necessary properties. After constructing the vCard, it serializes it to vCard format and writes it to a .vcf file.

Method 2: Manually Creating vCards

If external libraries are not an option, one can manually create vCards. This involves directly writing strings conforming to the vCard format, which gives full control over the output but requires more attention to detail.

Here’s an example:

import csv

def escape_semicolon(s):
    return s.replace(';', '\\;')

with open('contacts.csv', 'r') as csv_file, open('contacts.vcf', 'w') as vcf_file:
    reader = csv.reader(csv_file)
    for name, phone, email in reader:
        vcf_file.write(f"BEGIN:VCARD\nVERSION:3.0\n")
        vcf_file.write(f"N:{escape_semicolon(name)};;;\n")
        vcf_file.write(f"FN:{escape_semicolon(name)}\n")
        vcf_file.write(f"TEL;TYPE=CELL:{phone}\n")
        vcf_file.write(f"EMAIL:{email}\n")
        vcf_file.write("END:VCARD\n")

The output is similar to Method 1, producing a .vcf file with manually formatted vCards.

This code constructs the vCard by manually writing strings corresponding to each vCard property line by line. It also includes a function to escape semicolons – a detail necessary due to vCard formatting rules.

Method 3: Using the pandas Library

The pandas library, known for its data manipulation abilities, can also be used to transform CSV data into vCard format. This method is handy for those already familiar with pandas and looking to use its powerful data handling capabilities for the conversion process.

Here’s an example:

import pandas as pd
import vobject

df = pd.read_csv('contacts.csv')
for index, row in df.iterrows():
    vcard = vobject.vCard()
    vcard.add('n')
    vcard.n.value = vobject.vcard.Name(family=row['LastName'], given=row['FirstName'])
    vcard.add('fn')
    vcard.fn.value = row['Name']
    vcard.add('tel')
    vcard.tel.value = row['Phone']
    vcard.add('email')
    vcard.email.value = row['Email']
    with open(f"{row['LastName']}_{row['FirstName']}.vcf", 'w') as vcf_file:
        vcf_file.write(vcard.serialize())

This will generate individual .vcf files for each contact based on their Last and First Name.

In this example, pandas reads the CSV into a DataFrame and iterates over each row to create the vCard objects, then writes them to separate files. This method simplifies handling more complex CSV data formats and can easily be adapted for data transformations before converting to vCard format.

Method 4: Using ez-vcard Library

The ez-vcard Python library is another tool that can be used to convert CSV files to vCard format. It offers a more straightforward approach to creating vCards since it deals with many vCard peculiarities under the hood.

Here’s an example:

import csv
from ezvcard import VCard, Telephone, Email

with open('contacts.csv', 'r') as csv_file, open('contacts.vcf', 'w') as vcf_file:
    reader = csv.reader(csv_file)
    for row in reader:
        vcard = VCard()
        vcard.add('n').value = row[0]
        vcard.add(Telephone(row[1]))
        vcard.add(Email(row[2]))
        vcf_file.write(vcard.serialize())

The output again is a .vcf file containing all contacts formatted in vCard format.

The ez-vcard library makes it easy to create each vCard property with corresponding classes like Telephone and Email, reducing the possibility of manual errors and simplifying the code structure.

Bonus One-Liner Method 5: Using List Comprehension with vobject

For Python enthusiasts who like brevity, this one-liner uses list comprehension along with the vobject library to create vCards from a CSV file in a single pass.

Here’s an example:

import csv, vobject

[open('contacts.vcf', 'a').write(vobject.vCard().add('fn').value(row[0]).add('tel').value(row[1]).add('email').value(row[2]).serialize()) for row in csv.reader(open('contacts.csv', 'r'))]

The output is a .vcf file with vCards created from the CSV file content.

This dense one-liner encapsulates the reading of a CSV and the writing of a vCard in a single, albeit less readable, line of code. While it wins points for brevity, maintainability and readability take a hitβ€”best reserved for small, one-off scripts.

Summary/Discussion

  • Method 1: vobject Library. Easy to use. Abstracts away vCard format complexity. Requires external dependency.
  • Method 2: Manually creating vCards. Full control over format. Requires attention to vCard specification. No external dependencies.
  • Method 3: pandas Library. Excellent for handling complex CSV files. Allows preprocessing. Overkill for simple CSV files.
  • Method 4: ez-vcard Library. Easier and less prone to errors. Abstracts vCard creation. Another external dependency.
  • Method 5: One-liner List Comprehension. Short and sweet. Less readable. Best for quick and dirty scripts.