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.