Automatisierung · Python
PIM Cleanup
Produktdaten vereinheitlichen und Lücken sichtbar machen – ohne eine einzige Angabe zu erfinden.
Was es tut
Vereinheitlicht Kategorien und Produktnamen nach festen Regeln, lässt Abkürzungen und Maßangaben unangetastet und listet getrennt davon auf, welche Pflichtangaben je Artikel fehlen. Erfindet keinen einzigen Wert.
Ausgangslage
Produktdaten aus einem Shop- oder PIM-Export sind selten einheitlich. In den Beispieldaten – zehn Artikel aus dem Outdoor-Bereich – treten mehrere typische Probleme nebeneinander auf:
-
Uneinheitliche Namen:
wander rucksack 30l schwarzsteht nebenTHERMOSKANNE 1L EDELSTAHL. -
Uneinheitliche Kategorien: dieselbe Warengruppe
erscheint als
Rucksäckeund alsrucksack, dazuREGENBEKLEIDUNGundschlafsäckemit angehängtem Leerzeichen. - Fehlende Pflichtangaben: Beschreibung, Preis, Material, Farbe oder Bild-URL fehlen – bei einem Artikel sogar die Kategorie.
Solange beides vermischt bleibt, ist beides mühsam: Man kann die Daten nicht sauber sortieren, und man sieht nicht, wo noch inhaltliche Arbeit ansteht.
Diese Arbeit habe ich bei Birner fünf Monate lang im PIM-System von Hand gemacht — Artikel kategorisieren, Schreibweisen vereinheitlichen, Lücken melden. Die Regeln in diesem Skript sind die, die ich damals im Kopf hatte. Zum Werdegang →
Zwei getrennte Aufgaben
Vereinheitlichen ist eine Regelaufgabe – das kann ein Skript zuverlässig und immer gleich.
Fehlende Inhalte ergänzen ist eine inhaltliche Aufgabe – das kann nur ein Mensch, der das Produkt kennt.
Die Demo trennt beides sauber: eine bereinigte Datei und eine getrennte Liste dessen, was noch fehlt. Nichts wird aus dem Namen abgeleitet oder geschätzt.
Ablauf
Version 1 · Python-Werkzeug
läuftLiest die Rohdaten, wendet die Regeln an und schreibt zwei Ergebnisdateien. Bricht mit einer verständlichen Meldung ab, wenn die Datei fehlt, leer ist oder eine Pflichtspalte fehlt.
Vorher · produkte_roh.csv
A1002,Wanderrucksack 35L Blau,rucksack, 84.90,Blau,Nylon, A1008,Regenjacke Damen wasserdicht, REGENBEKLEIDUNG,,rot,,https://…/a1008.jpg A1010,Stirnlampe LED 300 Lumen,, 19.90,schwarz,,
Nachher · produkte_bereinigt.csv
A1002,Wanderrucksack 35L Blau,Rucksäcke, 84.90,Blau,Nylon, A1008,Regenjacke Damen Wasserdicht, Regenbekleidung,,rot,,https://…/a1008.jpg A1010,Stirnlampe LED 300 Lumen,, 19.90,schwarz,,
Auszug aus 10 Zeilen, Umbrüche zur Lesbarkeit eingefügt. Die
Kategorien sind vereinheitlicht,
LED bleibt groß – und die leeren Felder sind unverändert
leer geblieben.
Geprüfte Datensätze: 10 Kategorien automatisch vereinheitlicht: 3 Produkte mit mindestens einer fehlenden Pflichtangabe: 9/10 Dieses Skript hat KEINE fehlenden Werte erfunden oder geschätzt. Alles unten Gelistete braucht eine menschliche Entscheidung. - **A1002** (Wanderrucksack 35L Blau): fehlt Bild-URL - **A1008** (Regenjacke Damen Wasserdicht): fehlt Preis, Material - **A1010** (Stirnlampe LED 300 Lumen): fehlt Kategorie, Material, Bild-URL
Quellcode ansehen – Abkürzungsliste und Namensregel
# Abkürzungen, die in Produktnamen groß bleiben sollen. Bewusst eine kurze,
# explizite Liste: Das Skript rät nicht, welches Wort eine Abkürzung ist.
ABBREVIATIONS = {"LED", "UV", "XL", "XXL"}
# Kategorie-Mapping: verschiedene Schreibweisen -> eine kanonische Kategorie
CATEGORY_MAP = {
"rucksäcke": "Rucksäcke",
"rucksack": "Rucksäcke",
"trinkflaschen": "Trinkflaschen",
"zubehör": "Zubehör",
"zelte": "Zelte",
"schlafsäcke": "Schlafsäcke",
"schuhe": "Schuhe",
"regenbekleidung": "Regenbekleidung",
}
def normalize_name(raw: str) -> str:
"""Titelcase, aber Maßeinheiten/Zahlen und bekannte Abkürzungen unangetastet."""
if not raw:
return raw
words = raw.strip().split()
fixed = []
for w in words:
# Wörter mit Ziffern (30l, -5°C, 44) so lassen wie sie sind
if any(ch.isdigit() for ch in w):
fixed.append(w)
elif w.upper() in ABBREVIATIONS:
fixed.append(w.upper())
else:
fixed.append(w.capitalize())
return " ".join(fixed)
Die Normalisierungsregeln sind durch neun kleine Tests abgesichert
(python3 pim_cleanup.py --selftest).
Version 2 · Oberfläche
EntwurfDie Lückenliste als Arbeitsansicht, nach Dringlichkeit sortierbar. Alle Zahlen stammen aus dem tatsächlichen Report des Skripts oben – die Oberfläche selbst ist ein Gestaltungsentwurf und noch nicht implementiert.
| SKU | Name | Vollständigkeit | Es fehlt |
|---|---|---|---|
| A1010 | Stirnlampe LED 300 Lumen | 4/7 | Kategorie Material Bild-URL |
| A1008 | Regenjacke Damen Wasserdicht | 5/7 | Preis Material |
| A1004 | Trekkingstöcke Paar | 5/7 | Beschreibung Preis |
| A1002 | Wanderrucksack 35L Blau | 6/7 | Bild-URL |
| A1006 | Schlafsack Komfort -5°C | 7/7 | vollständig |
Oberflächenentwurf, Auszug aus 10 Zeilen. Die Kachel „geschätzt: 0“ ist Absicht – sie hält fest, dass keine einzige Angabe automatisch ergänzt wurde.
Version 3 · KI-gestützte Textvorschläge
in EntwicklungDie Regeln finden die Lücke. Für Texte – und nur für Texte – schlägt ein Sprachmodell eine Formulierung vor, die vor der Übernahme geprüft werden muss.
Entwurf der Oberfläche, nicht bedienbar. Drei der vier Lücken bleiben bewusst unangetastet – ein generierter Preis oder ein generiertes Material wäre genau das, was diese Arbeitsprobe vermeidet.
Was das Modell ausdrücklich nicht tut
Keine Preise, keine Materialien, keine Kategorien, keine Bild-URLs. Für harte Produktdaten wäre ein generierter Vorschlag eine erfundene Angabe, die aussieht wie eine gepflegte – und im Shop landet, ohne dass jemand den Unterschied bemerkt.
Der Kern: A1010
Bei Artikel A1010 ist die Kategorie leer – und bleibt leer. Das Skript könnte aus dem Namen „Stirnlampe“ eine Kategorie ableiten, tut es aber nicht, weil das Raten wäre.
Stattdessen taucht der Artikel im Report auf, mit der konkreten Angabe, was fehlt. Damit bleibt jederzeit unterscheidbar, welche Angabe aus den Daten stammt und welche jemand ergänzt hat.
Automatisierung
- liest die Datei ein und prüft jedes Pflichtfeld
- wendet Namens- und Kategorieregeln einheitlich an
- lässt unbekannte Kategorien unverändert
- listet auf, was leer ist
Mensch
- wählt die Pflichtfelder aus
- definiert die Zuordnungstabelle
- ergänzt Beschreibungen, Preise und Bilder
- entscheidet, was in den Shop geht
Grenzen
- Keine PIM-Plattform, keine Datenbank, kein Import in ein echtes System – das Skript liest und schreibt CSV-Dateien.
- Keine automatische Beschaffung fehlender Informationen. Beschreibungen, Preise und Bilder muss weiterhin ein Mensch liefern.
- Keine KI und keine Blackbox-Bewertung. Die Zuordnungstabelle steht fest im Code; was nicht darin steht, wird nicht zugeordnet.
- Die Namensregel ist bewusst einfach: Abkürzungen bleiben nur dann groß, wenn sie in der Liste im Code stehen. Eine kurze, nachlesbare Liste statt einer Regel, die rät, was eine Abkürzung ist.
-
Die Beispieldaten sind Demonstrationsdaten; die Bild-URLs verweisen
auf die reservierte Beispieldomain
example.com.
Dateien
- produkte_roh.csv Eingabe
- pim_cleanup.py Logik
- produkte_bereinigt.csv Ausgabe
- missing_information_report.md Lücken
- case_beschreibung.md Doku
Python-Standardbibliothek, kein Internetzugriff, keine Datenbank. Die vollständigen Dateien sende ich auf Anfrage gerne zu.