Hi all. Today we have a tool I wrote some time ago to work with Mac OS Property List (.plist) files. This files have an XML based format, and can serialize high level objects like integers, floats, strings, arrays and dictionaries. There’s also a legacy plist format that doesn’t use XML and should also be easy to parse, but we won’t bother with it since it’s been deprecated in Mac OS 10.0. Here is the Wikipedia entry on Property List files for more details.
Here’s an example Property List file, taken from the Mac OS X Manual Page for plist:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Year Of Birth</key> <integer>1965</integer> <key>Pets Names</key> <array/> <key>Picture</key> <data> PEKBpYGlmYFCPA== </data> <key>City of Birth</key> <string>Springfield</string> <key>Name</key> <string>John Doe</string> <key>Kids Names</key> <array> <string>John</string> <string>Kyra</string> </array> </dict> </plist>
As we can see, the data types supported by plist files are also supported natively by Python, so mapping Python objects as Property Lists should be quite straight forward, and it is. What I’m presenting here is a little tool that does the marshalling and unmarshalling, so you can use it pretty much like you would with Pickle, Shelve or Marshal.
A usage example. The following code reads the example plist file from above and produces a Python object, using the fromfile method.
from PList import PList plist = PList.fromfile('example.plist')
Yeah, kinda simple, isn’t it đŸ™‚
You can also load a plist from a string, using the fromstring method:
from PList import PList data = open('example.plist', 'r').read() plist = PList.fromstring(data)
Or from an ElementTree object, with the fromtree method:
from PList import PList from xml.etree import ElementTree tree = ElementTree.parse('example.plist') plist = PList.fromtree(tree)
In all cases the output is an ordinary Python object, tipically a dictionary or an array containing other objects. This is the Python object corresponding to the example plist shown above:
{'City of Birth': 'Springfield', 'Kids Names': ['John', 'Kyra'], 'Name': 'John Doe', 'Pets Names': [], 'Picture': '<B\x81\xa5\x81\xa5\x99\x81B<', 'Year Of Birth': 1965}
You can also write Python objects as Property List files. The output can be a string (the tostring method), an ElementTree tree (totree method) or a file (tofile method).
from PList import PList PList.tofile('output.plist', plist)