Re: [Pyobjc-dev] Obtain data from an Address Book card
Brought to you by:
ronaldoussoren
From: Ronald O. <ron...@ma...> - 2010-10-15 09:02:57
|
The script below creates a CSV file with all records in de AddressBook using the AddresBook framework. (This is the exportBooks.py script from the examples directory in the pyobjc-framework-AddressBook archive). The Python API to AddressBook is the same as the Objective-C one, in general Objective-C based examples should help to get you going with accessing the same APIs using PyObjC. Ronald # === #!/usr/bin/env python2.3 """ This script gives a short example on how to use the addressbook framework, it creates an CSV file containing information about all entries in the addressbook. Usage: python exportBook.py output.csv """ import csv import sys import AddressBook # The names of fields in the export, and the corresponding property. FIELD_NAMES=( ('Last Name', AddressBook.kABLastNameProperty), ('First Name', AddressBook.kABFirstNameProperty), ('E-mail', AddressBook.kABEmailProperty), ) def encodeField(value): """ Encode a value into an UTF-8 string """ if value is None: return '' if isinstance(value, AddressBook.ABMultiValue): # A multi-valued property, merge them into a single string result = [] for i in range(len(value)): result.append(value.valueAtIndex_(i).encode('utf-8')) return ', '.join(result) return value.encode('utf-8') def personToFields(person, fieldnames): """ Extract the specified fields from a person object """ return [ encodeField(person.valueForProperty_(nm)) for nm in fieldnames ] def bookFields(book, fieldnames): """ Generate the records for all people in the book """ for person in book.people(): yield personToFields(person, fieldnames) def main(argv = None): """ main entry point """ if argv is None: argv = sys.argv[1:] if len(argv) != 1: print "Usage: python exportBook.py output.csv" sys.exit(1) book = AddressBook.ABAddressBook.sharedAddressBook() fp = open(argv[0], 'wb') csvStream = csv.writer(fp) csvStream.writerow([ f[0] for f in FIELD_NAMES]) for row in bookFields(book, [ f[1] for f in FIELD_NAMES]): csvStream.writerow(row) fp.close() if __name__ == "__main__": main() #==== On 14 Oct, 2010,at 11:28 PM, Ned Deily <na...@ac...> wrote: In article <C8DCC28D.2B7B7%ja...@ja...>, Jeremy Reichman <ja...@ja...> wrote: > Does anyone have any examples of how to obtain data from cards via the > Address Book API with PyObjC? I'm not finding much (at least at my skill > level) via searching. > > My goal is to output a few of the fields from "my card." I'm interested in > this from the scripting perspective, not doing so in a full-fledged app. I'd > like to do it with Python, partly as a learning exercise. The little bit > I've done with PyObjC has been trying to update a script I wrote that used > the old Core Graphics bindings. > > If I were doing this via a shell script, I could get information with an > osascript line like this: > > $ osascript -e 'tell application "Address Book" to get the {first name, last > name, organization} of my card' > Leonardo, Flathead, GUE Tech You might consider using py-appscript instead: >>> from appscript import * >>> my_card = app("Address Book").my_card.properties() >>> [my_card.get(f) for f in (k.first_name, k.last_name, k.organization)] [u'Ned', u'Deily', k.missing_value] http://appscript.sourceforge.net/ -- Ned Deily, na...@ac... ------------------------------------------------------------------------------ Download new Adobe(R) Flash(R) Builder(TM) 4 The new Adobe(R) Flex(R) 4 and Flash(R) Builder(TM) 4 (formerly Flex(R) Builder(TM)) enable the development of rich applications that run across multiple browsers and platforms. Download your free trials today! http://p.sf.net/sfu/adobe-dev2dev _______________________________________________ Pyobjc-dev mailing list Pyo...@li... https://lists.sourceforge.net/lists/listinfo/pyobjc-dev |