ds_store package

class ds_store.DSStore(store)

Bases: object

Python interface to a .DS_Store file. Works by manipulating the file on the disk—so this code will work with .DS_Store files for very large directories.

A DSStore object can be used as if it was a mapping, e.g.:


will fetch the “Iloc” record for “foobar.dat”, or raise KeyError if there is no such record. If used in this manner, the DSStore object will return (type, value) tuples, unless the type is “blob” and the module knows how to decode it.

Currently, we know how to decode “Iloc”, “bwsp”, “lsvp”, “lsvP” and “icvp” blobs. “Iloc” decodes to an (x, y) tuple, while the others are all decoded using biplist.

Assignment also works, e.g.:

d['foobar.dat']['note'] = ('ustr', u'Hello World!')

as does deletion with del:

del d['foobar.dat']['note']

This is usually going to be the most convenient interface, though occasionally (for instance when creating a new .DS_Store file) you may wish to drop down to using DSStoreEntry objects directly.

class Partial(store, filename)

Bases: object

This is used to implement indexing.


Flush dirty data and close the underlying file.

DSStore.delete(filename, code)

Delete an item, identified by filename and code from the B-Tree.

DSStore.find(filename, code=None)

Returns a generator that will iterate over matching entries in the B-Tree.


Flush any dirty data back to the file.


Insert entry (which should be a DSStoreEntry) into the B-Tree.

classmethod DSStore.open(file_or_name, mode=u'r+', initial_entries=None)

Open a .DS_Store file; pass either a Python file object, or a filename in the file_or_name argument and a file access mode in the mode argument. If you are creating a new file using the “w” or “w+” modes, you may also specify a list of entries with which to initialise the file.

class ds_store.DSStoreEntry(filename, code, typecode, value=None)

Bases: object

Holds the data from an entry in a .DS_Store file. Note that this is not meant to represent the entry itself—i.e. if you change the type or value, your changes will not be reflected in the underlying file.

If you want to make a change, you should either use the DSStore object’s DSStore.insert() method (which will replace a key if it already exists), or the mapping access mode for DSStore (often simpler anyway).


Compute the length of this entry, in bytes

classmethod read(block)

Read a .DS_Store entry from the containing Block

write(block, insert=False)

Write this entry to the specified Block