Reading addressbook

Ian Bicking ianb at colorstudy.com
Wed Feb 5 15:22:38 EST 2003


On Mon, 2003-02-03 at 23:47, Wouter van Marle wrote:
> Hi!
> 
> Any tips/documents/etc on how to read:
> - Gnome addressbook (GnomeCard)
> - Evolution addressbook.
> 
> Reading is enough... can't find documentation on that. I really hope there
> are some python libs available!

It's just a quick hack, but I wanted command-line access to the
Evolution address book.  Attached is a script that does that.  You'd
want some sort of vCard parser to do this properly.


-- 
Ian Bicking  ianb at colorstudy.com  http://colorstudy.com
4869 N. Talman Ave., Chicago, IL 60625  /  773-275-7241
"There is no flag large enough to cover the shame of 
 killing innocent people" -- Howard Zinn
-------------- next part --------------
#!/usr/bin/python

import anydbm, os, re

addressBookLocation = os.path.join(os.environ['HOME'], 'evolution/local/Contacts/')

class AddressBook:
    def __init__(self, book=None):
        location = addressBookLocation
        for name in book or []:
            location = os.path.join(location, 'subfolders', name)
        location = os.path.join(location, 'addressbook.db')
        self.contacts = []
        file = anydbm.open(location)
        for key in file.keys():
            data = file[key]
            if not data.startswith('BEGIN:VCARD'):
                continue
            self.contacts.append(Contact(data))

    def find(self, text):
        results = []
        for contact in self.contacts:
            if contact.find(text):
                results.append(contact)
        return results

class Contact:

    _splitRE = re.compile(r'\r?\n')

    _ignoreFields = ['BEGIN', 'VERSION', 'END', 'UID', 'X-']
    
    def __init__(self, data):
        lines = self._splitRE.split(data)
        self.data = {}
        for line in lines:
            if not line.strip() or line == '\x00':
                continue
            if startswithany(line, self._ignoreFields):
                continue
            if line.find(':') == -1: continue
            label, value = line.split(':', 1)
            labels = tuple(label.split(';'))
            self.data[labels] = value
        
    def __str__(self):
        s = []
        for labels, value in self.data.items():
            s.append('%s: %s' % ('/'.join(labels), value))
        return '\n'.join(s)

    def find(self, text):
        for value in self.data.values():
            if value.lower().find(text.lower()) != -1:
                return True
        return False

def startswithany(s, patList):
    for pat in patList:
        if s.startswith(pat):
            return True
    return False

if __name__ == '__main__':
    import sys
    for c in AddressBook().find(sys.argv[1]):
        print c

        


More information about the Python-list mailing list