Ich weiss nicht ob Du alle Codecs hast. Und wie gesagt, man kann das nicht so einfach herausfinden. Man kann problemlos zur Laufzeit weitere Codecs hinzufügen und das macht man mit einer "Suchfunktion" die einen Codec-Namen bekommt und dann entweder die entsprechenden (En)Decoder und Reader und Writer Objekte zurückgibt oder `None`.
Kleines pathologisches Beispiel:
Code: Alles auswählen
In [9]:def mycodecs(name):
.9.: if name.startswith('spam'):
.9.: return (None, None, None, None)
.9.:
In [10]:codecs.register(mycodecs)
In [11]:codecs.lookup('foo')
---------------------------------------------------------------------------
exceptions.LookupError Traceback (most recent call last)
/home/bj/<ipython console>
LookupError: unknown encoding: foo
In [12]:codecs.lookup('spam_abc')
Out[12]:(None, None, None, None)
In [13]:codecs.lookup('spam_42')
Out[13]:(None, None, None, None)
Statt des Tupels müsste man natürlich die entsprechenden Objekte zurückgeben. Aber man sieht, das es jetzt unendlich viele Codecs gibt, deren Name mit 'spam' beginnt.
Ist ein blödes Beispiel, aber man könnte sich zum Beispiel einen 'rot13' Codec implementieren der nicht nur 13 sondern auch andere Verschiebungen erlaubt und sich die Zahl aus dem Namen holt.