Kurz gesagt
Python bringt alles für die Umwandlung von INI nach JSON von Haus aus mit: Das Modul configparser liest INI-Dateien mit Sektionen und Schlüssel-Wert-Paaren ein, das Modul json erzeugt daraus JSON. Beide gehören zur Standardbibliothek, es ist keine Installation nötig. Wichtig sind drei Punkte: mit encoding="utf-8" einlesen, Werte bei Bedarf in echte Typen casten und bei json.dumps die Parameter indent=2 und ensure_ascii=False setzen. Für eine schnelle, einmalige Umwandlung ohne Code ist der INI-zu-JSON-Konverter im Browser oft die bequemere Wahl.
configparser und json: die zwei Bordmittel
Für die Umwandlung von INI nach JSON brauchen Sie in Python keine externen Pakete. Zwei Module der Standardbibliothek genügen:
- configparser liest INI-Dateien. Es versteht Sektionen in eckigen Klammern, Schlüssel-Wert-Paare mit
=oder:und Kommentare, die mit#oder;beginnen. - json serialisiert Python-Datenstrukturen wie Dictionaries und Listen in JSON und liest JSON wieder ein.
Der gesamte Vorgang besteht aus drei klaren Schritten: INI einlesen, in ein Dictionary überführen, als JSON ausgeben. Als durchgehendes Beispiel dient diese kleine config.ini:
; Beispielkonfiguration
[allgemein]
sprache = de
debug = true
[datenbank]
host = localhost
port = 5432
benutzer = admin Schritt 1: INI-Datei einlesen
Sie erzeugen ein ConfigParser-Objekt und lesen die Datei ein. Geben Sie dabei unbedingt das Encoding an, sonst riskieren Sie kaputte Umlaute:
import configparser
parser = configparser.ConfigParser()
parser.read("config.ini", encoding="utf-8")
print(parser.sections())
# ['allgemein', 'datenbank']
Die Methode parser.sections() liefert die Liste der Sektionen, hier allgemein und datenbank. Auf einzelne Werte greifen Sie mit parser["datenbank"]["host"] zu. Wichtig zu wissen: Jeder so gelesene Wert ist zunächst ein String, auch "5432" und "true". Mehr dazu im Abschnitt zu den Datentypen.
Schritt 2: in ein Dictionary umwandeln
Das json-Modul kann ein ConfigParser-Objekt nicht direkt serialisieren. Sie überführen es vorher in ein gewöhnliches verschachteltes Dictionary. Eine knappe, lesbare Variante mit Dictionary-Comprehension:
data = {
section: dict(parser.items(section))
for section in parser.sections()
}
# data sieht jetzt so aus:
# {
# "allgemein": {"sprache": "de", "debug": "true"},
# "datenbank": {"host": "localhost", "port": "5432", "benutzer": "admin"}
# }
Jede Sektion wird zu einem Schlüssel im äußeren Dictionary, die enthaltenen Schlüssel-Wert-Paare zum inneren Dictionary. Das entspricht genau der Struktur, die unser Browser-Konverter erzeugt, wenn er eine INI-Datei mit Sektionen in verschachteltes JSON umwandelt. Wie diese Abbildung im Detail funktioniert und wie verschachtelte Sektionen wie [a.b] behandelt werden, beschreibt der Ratgeber Verschachtelte INI-Sektionen in JSON abbilden.
Schritt 3: als JSON ausgeben
Jetzt erzeugen Sie aus dem Dictionary den JSON-String. Zwei Parameter sind dabei entscheidend:
import json
ergebnis = json.dumps(data, indent=2, ensure_ascii=False)
print(ergebnis) indent=2sorgt für eine eingerückte, gut lesbare Ausgabe (Pretty-Print). Ohne diesen Parameter steht alles in einer einzigen Zeile.ensure_ascii=Falsehält Umlaute lesbar. Ohne ihn würde Python aus ä die Escape-Sequenzämachen, technisch korrekt, aber unschön.
Das Ergebnis für unser Beispiel sieht so aus:
{
"allgemein": {
"sprache": "de",
"debug": "true"
},
"datenbank": {
"host": "localhost",
"port": "5432",
"benutzer": "admin"
}
}
Fällt etwas auf? "debug" und "port" sind Strings, obwohl wir uns dort eher einen Boolean und eine Zahl wünschen. Das ist kein Fehler, sondern das erwartete Verhalten, das wir im nächsten Schritt beheben.
Datentypen in Python casten
INI speichert alles als Text, also gibt auch configparser alles als String zurück. Möchten Sie im JSON echte Zahlen und Wahrheitswerte, müssen Sie sie aktiv umwandeln. Python bietet dafür zwei Wege.
Die getter-Methoden von configparser
Für gezielten Zugriff gibt es getint, getfloat und getboolean. Letztere versteht true/false, yes/no, on/off und 1/0:
port = parser.getint("datenbank", "port") # 5432 (int)
debug = parser.getboolean("allgemein", "debug") # True (bool) Eine eigene Heuristik beim Umwandeln
Wollen Sie die Typen automatisch über alle Werte hinweg erkennen, hilft eine kleine Funktion. Sie macht genau das, was auch unser Browser-Tool als abschaltbare Typ-Heuristik anbietet:
def coerce(value: str):
low = value.strip().lower()
if low in ("true", "false"):
return low == "true"
try:
return int(value)
except ValueError:
pass
try:
return float(value)
except ValueError:
return value # bleibt String
Vorsicht ist hier geboten: Eine solche Heuristik kann danebenliegen. Eine führende Null wie bei einer Postleitzahl 04109 oder eine Versionsnummer 1.0 wird sonst fälschlich zur Zahl. Wenn Sie auf Nummer sicher gehen wollen, lassen Sie alle Werte als String. Welche Fälle die Heuristik typischerweise erwischt, vertieft der Ratgeber INI-Datentypen in JSON.
Stolperfallen: DEFAULT, Groß-/Kleinschreibung, Encoding
configparser hat einige Eigenheiten, die beim Umwandeln zu Überraschungen führen können:
| Eigenheit | Was passiert | Abhilfe |
|---|---|---|
| DEFAULT-Sektion | Werte werden an alle Sektionen vererbt | parser.sections() nutzen, defaults() separat behandeln |
| Schlüssel kleingeschrieben | Aus Port wird port | parser.optionxform = str setzen |
| Encoding fehlt | Umlaute werden kaputt | read(..., encoding="utf-8") |
| Doppelter Schlüssel | Wirft DuplicateOptionError | strict=False beim ConfigParser |
Besonders die DEFAULT-Sektion überrascht viele. Schreiben Sie einen Wert in [DEFAULT], taucht er beim Durchlaufen in jeder einzelnen Sektion auf. Das ist gewollt (Vererbung), kann aber unerwartetes JSON erzeugen. Ähnlich beim Casing: Standardmäßig schreibt configparser alle Schlüssel klein. Wer die ursprüngliche Schreibweise behalten will, setzt parser.optionxform = str direkt nach dem Anlegen des Parsers.
Das vollständige Skript
Alles zusammengesetzt ergibt ein kompaktes, wiederverwendbares Skript, das eine INI-Datei einliest, optional Typen erkennt und das JSON in eine Datei schreibt:
import configparser
import json
import sys
def coerce(value: str, typed: bool):
if not typed:
return value
low = value.strip().lower()
if low in ("true", "false"):
return low == "true"
try:
return int(value)
except ValueError:
pass
try:
return float(value)
except ValueError:
return value
def ini_to_json(pfad: str, typed: bool = True) -> str:
parser = configparser.ConfigParser()
parser.optionxform = str # Schreibweise der Schlüssel behalten
parser.read(pfad, encoding="utf-8")
data = {}
for section in parser.sections():
data[section] = {
key: coerce(val, typed)
for key, val in parser.items(section)
}
return json.dumps(data, indent=2, ensure_ascii=False)
if __name__ == "__main__":
quelle = sys.argv[1] if len(sys.argv) > 1 else "config.ini"
print(ini_to_json(quelle))
Aufgerufen mit python ini2json.py config.ini gibt das Skript das fertige JSON aus, das Sie per Umleitung auch direkt in eine Datei schreiben können: python ini2json.py config.ini > config.json. Den umgekehrten Weg, also JSON zurück nach INI, deckt der Ratgeber JSON in INI umwandeln ab.
Wann ein Browser-Tool die schnellere Wahl ist
Ein Python-Skript ist mächtig, aber nicht immer der schnellste Weg. Die Entscheidung hängt vom Anwendungsfall ab:
| Situation | Empfehlung |
|---|---|
| Einmalige Umwandlung, schnelles Ergebnis | Browser-Tool |
| Struktur einer INI-Datei prüfen | Browser-Tool |
| Keine Python-Umgebung zur Hand | Browser-Tool |
| Umwandlung automatisieren oder einbetten | Python-Skript |
| Viele Dateien im Stapel verarbeiten | Python-Skript |
Beide Ansätze schließen sich nicht aus. Praktisch ist, dass das Browser-Tool und das gezeigte Python-Skript dieselbe Logik abbilden: Sektionen werden zu Objekten, Werte optional typisiert, Umlaute bleiben erhalten. Der Konverter von ini-json.de läuft dabei zu 100 Prozent lokal in Ihrem Browser, ohne Upload und ohne Anmeldung, was gerade bei Konfigurationsdateien mit Zugangsdaten ein echter Vorteil ist. Mehr dazu im Ratgeber INI und JSON sicher umwandeln: Datenschutz.
Ohne Code direkt umwandeln
Kein Python zur Hand? Fügen Sie Ihr INI ein und erhalten Sie sofort JSON, mit wählbarer Einrückung und Typ-Heuristik. Lokal im Browser, ohne Upload.
Zum KonverterHäufige Fragen
Welches Modul liest INI in Python ein?
Das Standardmodul configparser. Es ist Teil der Python-Standardbibliothek, eine Installation ist nicht nötig. Für die JSON-Ausgabe kommt das ebenfalls eingebaute Modul json dazu.
Warum sind alle Werte Strings?
Weil INI keine Datentypen kennt und configparser deshalb jeden Wert als String liefert. Für echte Typen nutzen Sie getint, getfloat, getboolean oder eine eigene coerce-Funktion.
Wie behalte ich korrekte Umlaute?
Lesen Sie mit encoding="utf-8" ein und setzen Sie bei json.dumps den Parameter ensure_ascii=False. Sonst werden Umlaute zu Escape-Sequenzen wie u00e4.
Was hat es mit der DEFAULT-Sektion auf sich?
Werte in [DEFAULT] werden an alle Sektionen vererbt und tauchen deshalb in jeder Sektion auf. Nutzen Sie parser.sections() statt eines manuellen Durchlaufs und behandeln Sie parser.defaults() bei Bedarf separat.
Wann reicht statt Python ein Browser-Tool?
Für einmalige oder gelegentliche Umwandlungen und schnelle Strukturprüfungen ist das Browser-Tool schneller. Ein Skript lohnt sich, wenn Sie automatisieren, einbetten oder viele Dateien im Stapel verarbeiten.
Weiterführende Artikel
Quellen und Methodik
Die gezeigten Code-Beispiele beruhen auf den Modulen configparser und json der Python-Standardbibliothek (Python 3) und ihrem dokumentierten Verhalten, etwa der DEFAULT-Vererbung, der Methode optionxform und den Parametern indent und ensure_ascii von json.dumps. Das vollständige Skript wurde mit Python 3 nachvollzogen. Die beschriebene Typ-Heuristik bildet dasselbe Prinzip ab wie die abschaltbare Heuristik des Konverters auf dieser Seite. Stand: 25.06.2026.