Benutzerimport mit Umformungen

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
vbitbecks
User
Beiträge: 1
Registriert: Samstag 4. September 2021, 04:52

Samstag 4. September 2021, 05:14

Moin Zusammen,

ich hab mich schon ein bisschen mit Python auseinander gesetzt, habe aber trotztdem irgendwie Startschwierigkeiten :x.
Vielleicht kann mir jemand helfen oder mit mir zusammen den Weg mit Python gehen.

Ich möchte aus einer CSV Excel Tabelle mit Vornamen, Nachnahmen und Schulklassen eine Spalte oder neue CSV mit Account und Emailadresse erstellen.
Der Account soll aus drei Buchstaben des Vornamen und Nachnamen generiert werden. Dabei soll ein doppelter Accountname mit einer 1 aufwärts versehen werden.
Die generierten Emailadressen sollen aus Vor- und Nachnamen mit Anhängsel generiert werden. Wenn die Vornamen aus Bindestrichen bestehen, dann werden die in der Emailadresse übernommen, sonst nur der erste Name. Auch hier soll bei doppelten Einträgen eine 1 aufwärts hinter dem Namen angehängt werden. Achso und Umlaute sollen einfach ersetzt werden.

Dieses Projekt möchte ich gerne machen und benötige kurz irgendwie den Startschuss wie ich an besten Anfange :D

Vielen Dank

Beste Grüße
Ole aus HH 8)
---
Beste Grüße
Ole

Mail: ole@burr1.de
Fon: auf Anfrage :D
Benutzeravatar
sparrow
User
Beiträge: 2806
Registriert: Freitag 17. April 2009, 10:28

Samstag 4. September 2021, 09:18

Was ist eine CSV Excel Tabelle? Ist es nun ein CSV-Datei oder eine Excel-Tabelle?

Zu deiner Frage nach dem Startschuss:
Du fängst mit dem Auslesen der Daten aus der CSV an. Und die restlichen Anforderungen hast du ja oben ausgeführt - die musst du dann nur in Code übersetzen. Mehr kann man dazu kaum sagen.

Ansonsten gelten die gängigen Regeln für Python-Proramme: PEP-8 beachten, kein Code auf Modulebene außer Importe, Konstanten und Definitionen von Klassen und Funktionen, den Start des Programms in eine main()-Funktion und das übliche if __name__ == ... um main zu starten.
Sirius3
User
Beiträge: 15002
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 4. September 2021, 09:42

Das erste, mit dem man anfängt, sind Tests schreiben, für eine Funktion, die aus Vor-, Nachnamen und optionalem Anhängsel eine Email-Adresse erzeugt. Dafür überlegst Du Dir für alle Sonderfälle mindestens eine Variante aus Vor- und Nachname. Also mit und ohne Bindestrich, mit Umlauten, Akzenten, Scharfen Essen, von und zu, usw.
Eine solche Testfunktion sieht typischerweise so aus

Code: Alles auswählen

def test_generate_email():
    assert generate_email("Hans-Jürgen", "von Schußheim-Lippe") == "hans-juergen.schussheim-lippe@schule.de"
    assert generate_email("André", "Klein", 1) == "andre.klein1@schule.de"
Danach kannst Du anfangen, diese Funktion zu schreiben und immer gleich testen, ob die Testfunktion fehlerfrei durchläuft.
Benutzeravatar
__blackjack__
User
Beiträge: 9095
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 4. September 2021, 16:51

Wobei man das laufen lassen der Tests IMHO auch gleich mit `pytest` machen kann. Das wäre in dem von Sirius3 gezeigten Beispiel sehr einfach.

Man kann dann auch langsam anfangen die Möglichkeiten von dem Werkzeug zu verwenden. Beispielsweise parametrisierte Tests.

Code: Alles auswählen

@pytest.mark.parametrize(
    "name, surname, number, expected",
    [
        (
            "Hans-Jürgen",
            "von Schußheim-Lippe",
            None,
            "hans-juergen.schussheim-lippe@schule.de",
        ),
        ("André", "Klein", 1, "andre.klein1@schule.de"),
    ],
)
def test_generate_email(name, surname, number, expected):
    assert generate_email(name, surname, number) == expected
Wobei die API für das Beispiel hier falsch ist, denn um die 1 für André Klein zu ermitteln muss man vorher ja den E-Mail-Adressaten schon mal gebildet haben, denn nur dann kann man ja überhaupt feststellen ob man eine Zahl anhängen muss.
“When we write programs that "learn", it turns out that we do and they don't.” — Alan J. Perlis
rogerb
User
Beiträge: 534
Registriert: Dienstag 26. November 2019, 23:24

Samstag 4. September 2021, 21:03

Um gute Tests zu schreiben, braucht man schon eine gewisse Erfahrung und Beherrschung der Sprache. Ich weiß nicht ob das als Anfängertipp zu hilfreich ist. Aber das muss jeder selbst wissen.
rogerb
User
Beiträge: 534
Registriert: Dienstag 26. November 2019, 23:24

Samstag 4. September 2021, 21:18

@vbitbecks,

um dein Vorhaben zu realisieren müsstest du dich zunächst mal mit dem Lesen und Schreiben von CSV-Dateien beschäftigen.
Informationen dazu findest du zum Beispiel hier:
https://docs.python.org/3/library/csv.html#csv.reader

Du kannst ja mal deinen ersten Code hier posten, falls du Hilfe brauchst.
Benutzeravatar
__blackjack__
User
Beiträge: 9095
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sonntag 5. September 2021, 00:16

@rogerb: Leute entmutigen wirklich einfache Tests gegen die Spezifikation zu schreiben ist vielleicht nicht so hilfreich. Aber das muss ja jeder selbst wissen. 😉

Warum muss man die Sprache dafür gut beherrschen? Man muss doch bloss Funktionen schreiben, welche die zu testende Funktion aufruft und das Ergebnis mit dem vergleicht was man erwartet. Einziger Zusatz ist erst einmal die ``assert``-Anweisung — das andere muss man sowieso können/lernen um das Programm zu schreiben. Sirius3 hat ja ein Beispiel gezeigt.

Das Schwierige bei Tests ist die Testfälle zu finden/wählen, so das möglichst alle Fälle abgedeckt sind. Aber auch darüber muss man sich auch ohne Tests Gedanken machen, denn man muss ja den Programmcode schreiben der alle möglichen Fälle abdeckt. Man kann da halt nur Glück haben, dass Fälle die man dabei nicht berücksichtigt, zufällig in den Daten nicht auftauchen, oder das Pech das sie auftauchen, man aber die fehlerhaften Daten, die daraus dann produziert werden, nicht (rechtzeitig) bemerkt.

@vbitbecks: So ganz allgemein zerlegt man das Gesamtproblem in Teilprobleme. Und diese Teilprobleme wieder in kleinere Teilprobleme. Solange bis sich die Teilprobleme mit einer Funktion mit einigen Zeilen Code gelöst werden können. Das macht man dann. Jede Funktion testet man bevor man mit der nächsten weiter macht. Aus den Teillösungen kann man dann Funktionen schreiben, die grössere Teilprobleme lösen, bis man am Ende das Gesamtproblem gelöst hat.

Ganz generell gibt es zwei bewährte ”Bruchkanten” an denen man Probleme aufteilen kann: Dort wo Daten das Programm betreten oder verlassen. Also Eingabe, Verarbeitung, und Ausgabe sind hier drei Teilprobleme die man getrennt entwickeln und testen kann. Und das andere ist das verarbeiten von Datenströmen vom verarbeiten einzelner Datensätze aus dem Strom zu trennen. Also das Umwandeln/Ergänzen aller Datensätze so zu gestalten, dass man Code schreibt der *einen* Datensatz bearbeitet, und wenn man den hat, kann man den in der Regel recht trivial in einer weiteren Teillösung verwenden um diese Funktion auf alle Datensätze anzuwenden.
“When we write programs that "learn", it turns out that we do and they don't.” — Alan J. Perlis
Antworten