Python – des Testers bester Freund
von Carsten
In so manchem Projekt habe ich als Tester das Problem, dass ich irgendwelche vergrützten CSV-Dateien durchschauen, transformieren und importieren muss. Jetzt hat man die Möglichkeit dies per Hand oder mit Hilfe von Excel zu machen. Mir war das zu konvetionell!
Meine Empfehlung an alle, die dem Programmieren mächtig sind: Python! Meine Begründung:
- Auf jedem Unix-System vorhanden.
- Falls man Windows benutzen muss: Portable Python
- Einfach zu erlernen
- Python comes with batteries included! ;)
Was ich mit Punkt 4 sagen möchte, zeige ich kurz an zwei Beispielen.
1. CSV-Dateien transformieren
Python bringt das Modul csv von Haus aus mit. Damit kann man auf einfachste Weise CSV-Dateien einlesen, bearbeiten und speichern.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #!/usr/bin/env python import csv import sys from os import * # Datei öffnen und einen csv-reader initialisieren source = file(fileName, "rb") reader = csv.DictReader(source, delimiter=";") # csv-writer initialisieren und die Kopfzeile schreiben targetHandle = file(targetCsv, "wb") writer = csv.DictWriter(target, ["NAME", "FIRSTNAME", "NICKNAME"], delimiter=";") writer.writerow({"NAME" : "NAME", "FIRSTNAME" : "FIRSTNAME", "NICKNAME" : "NICKNAME"}) for row in reader: # Zugriff auf die Felder der jeweiligen Zeilen name = row['NAME'] firstname = row['FIRSTNAME'] nickname = row['NICKNAME'] # Tausche Namen und Vornamen und entferne Leerzeichen data = { 'NAME': firstname.replace(' ', ''), 'FIRSTNAME': name.replace(' ', ''), 'NICKNAME': nickname.replace(' ', '') } writer.writerow(data) # Aufräumen source.close() target.close() exit() |
2. Lange CSV in viele kleine aufteilen
Ich hatte das Problem, dass Daten in einer riesigen (1000 Zeilen) CSV geliefert wurden. Der Importer bricht komplett ab, sobald eine Zeile fehlerhaft ist. Um zu wissen, welche Zeile den Fehler hat, habe ich die CSV in einzelne CSV-Dateien aufgeteilt. Jede Zeile zu einer CSV. Da der Importer auch mehrere Dateien bearbeiten konnte und fehlerhafte CSV-Dateien in ein entsprechendes Verzeichnis kopierte, konnte ich so die fehlerhaften Datensätze ausfindig machen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/usr/bin/env python import sys from os import * totalCount = 0 # Datei lesend öffnen sourceHandle = file("input.csv", "r") header = 'NAME;FIRSTNAME,NICKNAME\n' myPath = path.join(curdir, 'split') for row in sourceHandle: totalCount = totalCount + 1 fields = row.split(';',3) name = fields[0] output = file(myPath+"/"+ name + "_" + str(totalCount) + '.csv','w') output.writelines([header, row]) output.close() # close read file sourceHandle.close() print totalCount exit() |
Dies sind zwei kurze Beispiele, wie man sich mit Python das (Tester)Leben einfacher gestalten kann. Ich hatte auch umfangreichere Skripte im Einsatz, die eine textbasierte Schnittstelle automatisch prüften. Der Vorteil war, dass ich in der Lage war alle gelieferten Daten direkt zu validieren. Der initiale Aufwand von 2-3h zur Erstellung des Skriptes war damit schnell amortisiert, da eine aufwendige Sichtprüfung nur noch in Stichproben notwendig war.
Hinweis:
Die hier gezeigten Skripte sind modifizierte Werke aus meinem Alltag. Daher kann es sein, dass sie nicht auf anhieb lauffähig sind, und sollen nur Denkanstöße liefern. Weiterhin sind alle Quick’n'Dirty, da sie meist nur ein- bis zweimal benutzt wurden und schnell fertig sein mussten.