CSV-zu-XMLkonverter

Entwickler · 9 Min. Lesezeit

CSV in XML mit Python umwandeln: Code-Beispiel und wann ein Tool reicht

CSV in XML mit Python umwandeln: vollständiges, lauffähiges Code-Beispiel mit csv und xml.etree.ElementTree, eine Variante mit manuellem String, ein Wort zu pandas.to_xml() und die Frage, wann sich Python lohnt und wann ein Browser-Tool reicht.

Eike-Christian Ramcke
Eike-Christian Ramcke Veröffentlicht Geprüft

Kurz gesagt

Mit Python wandelst du CSV in XML komplett mit der Standardbibliothek um: csv.DictReader liest die Zeilen, xml.etree.ElementTree baut den Baum, dann schreibst du ihn als UTF-8. Das Escaping von Sonderzeichen übernimmt Python automatisch. Wer pandas nutzt, kann DataFrame.to_xml() verwenden. Python lohnt sich bei Automatisierung und großen Jobs, für eine einmalige Umwandlung reicht unser Browser-Tool ohne Setup und ohne Upload.

Warum die Standardbibliothek genügt

Für die Umwandlung von CSV in XML brauchst du in Python kein einziges Zusatzpaket. Die beiden Module csv und xml.etree.ElementTree sind seit jeher Teil der Standardbibliothek und decken den gesamten Ablauf ab: CSV einlesen, einen Element-Baum aufbauen und als XML-Datei schreiben. Das hält dein Skript schlank und portabel, weil es überall läuft, wo Python installiert ist.

Der grundsätzliche Ablauf ist immer derselbe und besteht aus drei Schritten. Zuerst liest du die CSV-Datei zeilenweise ein, am besten so, dass jede Zeile als Zuordnung von Spaltenname zu Wert vorliegt. Im zweiten Schritt baust du daraus eine Baumstruktur auf: ein Wurzelelement als Container und darunter pro CSV-Zeile ein Datensatz-Element, das die einzelnen Spaltenwerte als Kind-Elemente trägt. Im dritten Schritt schreibst du diesen Baum als XML-Datei heraus. Wer die Begriffe Wurzelelement und Datensatz-Element noch nicht klar vor Augen hat, findet die Grundlagen im Ratgeber Root- und Datensatz-Element erklärt. Genau dieses Modell setzen die folgenden Code-Beispiele um.

Vollständiges Beispiel mit ElementTree

Das folgende Skript liest eine Datei daten.csv ein und schreibt eine daten.xml. Es ist lauffähig und nutzt nur die Standardbibliothek. Die Spaltennamen aus der Kopfzeile werden zu den Namen der Kind-Elemente, jede Zeile wird zu einem row-Element unter dem Root root:

import csv
import re
import xml.etree.ElementTree as ET


def clean_tag(name):
    """Macht aus einem Spaltennamen einen gültigen XML-Tag-Namen."""
    tag = re.sub(r"\s+", "_", name.strip())
    tag = re.sub(r"[^\w.\-]", "", tag)
    if not tag or not (tag[0].isalpha() or tag[0] == "_"):
        tag = "_" + tag
    return tag


def csv_to_xml(csv_path, xml_path, root_name="root", row_name="row"):
    root = ET.Element(root_name)

    with open(csv_path, newline="", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for zeile in reader:
            datensatz = ET.SubElement(root, row_name)
            for spalte, wert in zeile.items():
                feld = ET.SubElement(datensatz, clean_tag(spalte))
                feld.text = "" if wert is None else str(wert)

    baum = ET.ElementTree(root)
    ET.indent(baum, space="  ")  # ab Python 3.9, sorgt fuer Einrueckung
    baum.write(xml_path, encoding="utf-8", xml_declaration=True)


if __name__ == "__main__":
    csv_to_xml("daten.csv", "daten.xml", root_name="produkte", row_name="produkt")
    print("Fertig: daten.xml wurde geschrieben.")

Wichtig ist das encoding="utf-8" sowohl beim Öffnen der CSV als auch beim Schreiben. Damit bleiben Umlaute und andere Zeichen korrekt erhalten. Das Escaping von Sonderzeichen wie <, > und & übernimmt ElementTree automatisch, du musst also nichts von Hand ersetzen. Die Funktion clean_tag stellt sicher, dass auch Spaltennamen mit Leerzeichen oder führenden Ziffern zu gültigen Tags werden, genau wie es unser Browser-Tool tut. Mehr dazu im Ratgeber CSV in XML umwandeln.

Ein paar Details lohnen die Aufmerksamkeit. csv.DictReader nimmt die erste Zeile der CSV automatisch als Kopfzeile und nutzt deren Werte als Schlüssel. Stimmt das Trennzeichen nicht, etwa weil deine Datei ein Semikolon statt eines Kommas verwendet, übergibst du es ausdrücklich mit csv.DictReader(f, delimiter=";"). Warum deutsche Dateien oft ein Semikolon nutzen, erklärt der Ratgeber CSV mit Semikolon als Trennzeichen. Der Parameter newline="" beim Öffnen verhindert, dass es bei mehrzeiligen Feldern zu doppelten Zeilenumbrüchen kommt, das ist die offiziell empfohlene Schreibweise. Und ET.indent ist optional: Es sorgt nur für eine eingerückte, lesbare Ausgabe und steht ab Python 3.9 zur Verfügung. Ältere Versionen schreiben die XML dann in eine einzige lange Zeile, was inhaltlich völlig gleichwertig ist.

Variante: nur csv plus manueller String

Wer ohne ElementTree auskommen will, kann den XML-Text auch von Hand zusammensetzen. Dann musst du das Escaping aber selbst übernehmen, sonst zerbricht die Datei an einem einzelnen &. Dafür gibt es xml.sax.saxutils.escape:

import csv
from xml.sax.saxutils import escape

with open("daten.csv", newline="", encoding="utf-8") as f, \
     open("daten.xml", "w", encoding="utf-8") as out:
    reader = csv.DictReader(f)
    out.write('<?xml version="1.0" encoding="UTF-8"?>\n')
    out.write("<produkte>\n")
    for zeile in reader:
        out.write("  <produkt>\n")
        for spalte, wert in zeile.items():
            tag = spalte.strip().replace(" ", "_")
            out.write(f"    <{tag}>{escape(wert or '')}</{tag}>\n")
        out.write("  </produkt>\n")
    out.write("</produkte>\n")

Diese Variante ist transparent, aber fehleranfälliger. ElementTree ist für die meisten Fälle die robustere Wahl, weil es Escaping und Wohlgeformtheit garantiert.

Kurz erwähnt: pandas.to_xml()

Wer pandas ohnehin im Projekt hat, kommt mit wenigen Zeilen ans Ziel. DataFrame.to_xml() ist seit pandas 1.3 verfügbar:

import pandas as pd

df = pd.read_csv("daten.csv")
df.to_xml("daten.xml", root_name="produkte", row_name="produkt",
          index=False, encoding="utf-8")

Das ist bequem, zieht aber eine große Abhängigkeit nach sich, die sich nur lohnt, wenn du pandas sowieso für die Datenverarbeitung nutzt. Für ein einzelnes Konvertierungsskript ist die Standardbibliothek leichtgewichtiger.

Wann Python lohnt, wann das Tool reicht

Beide Wege haben ihre Berechtigung. Diese Tabelle hilft bei der Entscheidung:

Situation Empfehlung
Wiederkehrender, automatisierter Job Python
Sehr große oder viele Dateien Python
Teil einer Daten-Pipeline Python
Einmalige Umwandlung, kein Setup Browser-Tool
Kein Python verfügbar, sensible Daten Browser-Tool

Brauchst du keine Automatisierung, sondern willst eine Datei schnell und ohne Installation umwandeln, ist unser CSV-zu-XML-Konverter der direkte Weg: kein Setup, kein Upload, alles läuft im Browser. Wer dieselbe Aufgabe ohne Code in einer Tabellenkalkulation lösen will, findet Hinweise im Ratgeber CSV in XML mit Excel.

Häufige Fragen

Wie wandle ich CSV mit Python in XML um?

Mit csv.DictReader die Zeilen einlesen, mit xml.etree.ElementTree einen Baum aus Root und Datensatz-Elementen bauen und als UTF-8 schreiben. Keine Zusatzpakete nötig.

Brauche ich pandas?

Nein. Die Standardbibliothek reicht. Wer pandas nutzt, kann mit DataFrame.to_xml() in einer Zeile XML erzeugen.

Wie stelle ich UTF-8 und Escaping sicher?

CSV mit encoding utf-8 öffnen und XML mit encoding utf-8 schreiben. ElementTree escaped Sonderzeichen automatisch.

Wann reicht ein Tool statt Python?

Bei einmaliger Umwandlung ohne Setup und ohne Upload reicht das Browser-Tool. Python lohnt bei Automatisierung und großen, wiederkehrenden Jobs.

Weiterführende Artikel

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige