[Python-Dev] mimetypes and _winreg

Mike Brown mike at skew.org
Fri Jun 11 18:01:56 EDT 2004


I thought it would be nice to try to improve the mimetypes module by having 
it, on Windows, query the Registry to get the mapping of filename extensions 
to media types, since the mimetypes code currently just blindly checks 
posix-specific paths for httpd-style mapping files. However, it seems that the 
way to get mappings from the Windows registry is excessively slow in Python.

I'm told that the reason has to do with the limited subset of APIs that are 
exposed in the _winreg module. I think it is that EnumKey(key, index) is 
querying for the entire list of subkeys for the given key every time you call 
it. Or something. Whatever the situation is, the code I tried below is way 
slower than I think it ought to be.

Does anyone have any suggestions (besides "write it in C")? Could _winreg 
possibly be improved to provide an iterator or better interface to get the 
subkeys? (or certain ones? There are a lot of keys under HKEY_CLASSES_ROOT, 
and I only need the ones that start with a period). Should I file this as a
feature request?

Thanks

-Mike


from _winreg import HKEY_CLASSES_ROOT, OpenKey, EnumKey, QueryValueEx

i = 0
typemap = {}
try:
    while 1:
        subkeyname = EnumKey(HKEY_CLASSES_ROOT, i)
        try:
            subkey = OpenKey(HKEY_CLASSES_ROOT, subkeyname)
            if subkeyname[:1] == '.':
                data = QueryValueEx(subkey, 'Content Type')[0]
                print subkeyname, '=', data
                typemap[subkeyname] = data   # data will be unicode
        except EnvironmentError, WindowsError:
            pass
        i += 1
except WindowsError:
    pass




More information about the Python-Dev mailing list