Daten in einer mysql Tabelle sortieren

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du dir Muehe gibst, kannst du bestimmt noch irgendwo ein int(database) mehr unterbringen :wink:

Das erste ist notwendig. Die beiden danach nicht, und es ist ungewoehnlich, einen Namen dann an einen anderen Wert zu binden, der auch noch einen anderen Datentyp hat. Statt also immer database zu recyceln, nenn die Variable anders (wie kann ich an dem Snippet nun auch nicht erkennen)

Und danach nochmal str(database) ist natuerlich ebenfalls voellig ueberfluessig, wenn da schon ein string drin ist.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

@deets.
Vielen Dank für deine Hinweise. Der Code ist jetzt überarbeitet und sollte so jetzt passen.
Schreibe das Ergebnis jetzt noch in eine andere .csv, für das Erfolgserlebnis :)

Code: Alles auswählen

database = []
ready = []

with open ("adressen.csv","r") as file, open ("adressen_ausgabe.csv","w") as ausgabe:
    
    for data in file:
        data = data.strip().split(";")
        plz_data = data[1]
        plz_3digits = int(plz_data[:3])
        
        if plz_3digits >= 100 and plz_3digits <= 249:
            plz_3digits = "Text 1"
        elif plz_3digits >= 250 and plz_3digits <= 299:
            plz_3digits = "Text 2"
        else: 
            plz_3digits = "Text 3"
 
        ready = (data[0] + "; " + data[1] + "; " + data[2] + "; " + plz_3digits + "\n")
    
        print (ready)
        
        ausgabe.write(ready)
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: Du benutzt immer noch die selbe Variable für PLZ und PLZ-Gebiet, nur dass es nun plz_3digits statt database heißt.
Wenn Du Dich die ersten beiden Ziffern nicht interessieren, dann nimmt man die 5-stellige PLZ und teilt sie durch 100. Hier würde ich aber einfach auf die 5 Stellen prüfen. Benutze ';'.join oder gleich besser das csv-Modul. database und ready werden initalisiert aber nicht benutzt.

Code: Alles auswählen

with open("adressen.csv") as input_lines, open("adressen_ausgabe.csv", "w") as output:
    for entry in input_lines:
        entry = entry.strip().split(";")
        postal_code = int(entry[1])
        if postal_code >= 10000 and postal_code <= 24999:
            area_code = "Text 1"
        elif postal_code >= 25000 and postal_code <= 29999:
            area_code = "Text 2"
        else: 
            area_code = "Text 3"
        entry.append(area_code)
        output.write(';'.join(entry) + '\n')
Die Herausforderung, die Daten aus einer zweiten Datei herhauszuholen, hast Du aufgegeben??
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

@Sirius3.
Vielen Dank, der Code funktioniert einwandfrei.
Jetzt möchte ich einen Schritt weiter gehen und die PLZ Werte, die abgeglichen werden sollen auch
aus einer .csv ziehen und als Variable weiter verarbeiten.
Ich weiß leider nur nicht wie, bzw. habe ich die Logik dahinter noch nicht verstanden.

In erster Instanz öffne ich die "paletten_gebiete.csv", lege mir diese für meinen Code zurecht,
beende die Schleife dann aber wieder ohne damit in der zweiten Schleife etwas anfangen zu können.

Hier liegt mein Problem. Wie kann ich die Variablen "pal_zip_begin", "pal_zip_end" und den "area_code"
behalten und in dem Script weiter verwerten?

Code: Alles auswählen


with open ("paletten_gebiete.csv", "r") as input_lines_pallet:
    
    for entry_pal in input_lines_pallet:
        entry_pal = entry_pal.strip().split(";")
        pal_zip_begin = int(entry_pal[1])
        pal_zip_end = int(entry_pal[2])
        area_code = (entry_pal[3])
        
        
with open ("adressen.csv","r") as input_lines_adress, open ("adressen_ausgabe.csv","w") as output:
    
    for entry_adress in input_lines_adress:
        entry_adress = entry_adress.strip().split(";")
        postal_code = int(entry_adress[1])
        
        if postal_code >= pal_zip_begin and postal_code <= pal_zip_end:
            area_code_output = area_code
        elif postal_code >= pal_zip_begin and postal_code <= pal_zip_end:
            area_code_output = area_code
        else: 
            area_code_output = area_code
 
        entry_adress.append(area_code_output)
        output.write(";".join(entry_adress) + "\n")
    
        print (entry_adress)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst sie in eine Datenstruktur stecken. Welche dazu geeignet ist kann ich nicht sagen, das haengt davon ab, was du damit machen willst.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Mit Datenstruktur meinst du Liste, Wörterbuch oder Tupel?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Grundsätzlich ja, im vorliegenden Fall nur die ersten zwei. Ein Tupel ist technisch möglich aber eine schlechte Wahl weil es nicht auf Wachstum ausgelegt ist.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Guten Abend Leute,
ich hänge mal wieder. Aktuell versuche ich die paletten_gebiete.csv einzulesen und die entstandene Liste in ein Wörterbuch zu wandeln.
Leider ohne Erfolg. Habt ihr noch einen Tipp für mich?

PS. Der Thread heißt ja "Daten in einer mysql Tabelle sortieren". Ist ja nicht mehr wirklich aktuell. Kann das geändert werden?
Z.B. in "Listen mit Variablen aus einem Wörterbuch anreichern".

Code: Alles auswählen

def pal_func():
    
    with open ("paletten_gebiete.csv", "r") as entry_pal:
        for line in entry_pal:
            line_split = line.strip().split(";")
            #print (line_split)
            row1 = [line_split[0]]
            row2 = [line_split[1]]
            #print (row1)
            #print (row2)
            pal_dic = {}
            pal_dic[row1] = row2
            print (pal_dic)
            
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: damit eine Funktion etwas sinnvolles macht, braucht sie einen Rückgabewert. Was soll zurückgegeben werden? Was hast Du Dir bei `row1` und `row2` gedacht? Warum sind das Listen mit genau einem Element? Was wären bessere Namen, statt row1 und row2? Warum erstellst Du für jede Zeile ein Wörterbuch mit genau einem Element?
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

@Sirius3: Meine Datei paletten_gebiete.csv lese ich Zeile für Zeile in eine Liste aus und möchte mir daraus ein Wörterbuch schreiben.
Im Idealfall soll es dann so aussehen:
{'10000': 'TEXT1', '10100': 'TEXT2', '10200': 'TEXT3', '10300': TEXT4'}
usw.
Dieses Wörterbuch möchte ich dann wiederum nutzen um eine PLZ aus der Liste "adressen" mit diesem abzugleichen und den entsprechenden Wert in meiner Datei adressen.csv anreichern.

Die Funktion soll also ein Wörterbuch ausgeben. (Den key mit PLZ vergleichen und den Wert anreichern)

Ich bin mir aber nicht wirklich sicher, ob ich das so richtig sinnvoll angehe.
Wenn ich meine Liste "adressen" mit einer for Schleife mit dem Wörterbuch abgleiche müssen ja alle Werte in meinem Wörterbuch in einer "line" stehen um dieses nicht auch mit einer weiteren Schleife auslesen zu müssen. (was meines wissens nicht geht)

Ich hoffe ihr versteht was ich meine :)
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: wir verstehen Dich, aber verstehst Du auch, was Du geschrieben hast? Konkret, kannst Du auch meine restlichen Fragen beantworten?
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Hallo zusammen, ich denke ich habe es gelöst.
Zwar ist es noch keine Funktion, aber es scheint genau das zu tun, was ich mir wünsche :)
Baue die Variable, bzw. final dann die hoffentlich die Funktion in mein anderes Skript und berichte dann noch einmal.

Code: Alles auswählen

pal_gebiete = {}                                                			# pal_gebiete = Datentyp Dictionary
with open ("paletten_gebiete.csv", "r") as entry_pal:           # öffnen der .csv (lesen)
    for line_pal in entry_pal:                                  		# lesen der .csv (Zeile für Zeile)
        line_pal_split = line_pal.strip().split(";")            		# Zeilenumbruch entfernen, Semikolon als Trennzeichen
        pal_gebiete[line_pal_split[0]] = line_pal_split[1]      	# d[Keyzeile bestimmen] = Valuezeile bestimmen
print (pal_gebiete)                                             		# wenn Schleife am Ende, letzte Zeile ausgeben
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Jetzt hänge ich an der "weiteren Verarbeitung" meiner Wörterbuch Variable :(
Die Zuordnung scheint zu funktionieren, aber den Wert bekomme ich nicht einzeln. Wäre es nicht sowieso geschickter mit einem == zu arbeiten?
Funktioniert nur leider nicht.

Code: Alles auswählen

with open ("adressen_cz.csv","r") as input_lines_adress, open ("adressen_cz_ausgabe.csv","w") as output:
    
    for entry_adress in input_lines_adress:
        entry_adress = entry_adress.strip().split(";")
        postal_code = (entry_adress[1])
        
        if postal_code in pal_gebiete:			#Hier scheint er direkt den Schlüsselwert als Vegleich zu benutzen
            print (postal_code + str(pal_gebiete))	# Aber wie bekomme ich hier den jeweiligen Wert ausgegeben?
        else:
            print ("PLZ_FALSCH")
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Programmieren ist nicht raten. Hast du dir mal angeschaut, was das offizielle Python Tutorial zum Umgang mit Woerterbuechern erzaehlt?

https://docs.python.org/3/tutorial/data ... ctionaries

Da steht uA, wie du das loest.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Leute, ich komme einfach nicht weiter...
@deets. Danke für deinen Hinweis, nein, das hatte ich mir noch nicht angeschaut. Ich mache gerade einen Onlinekurs, hier wurde meine
Fragestellung aber noch nicht Thematisiert. Ich greife dem ganzen vor, da ich es für mich am interessantesten finde nebenbei ein Projekt
zu bearbeiten "das mir auch wirklich was bringt". Ein praktisches Beispiel sozusagen.

Die Funktionen zip() und items() habe ich mir angesehen. Sehr spannend, aber so wie ich das sehe benötige ich dann eine zweite Schleife. Ich glaube nicht, dass dies sinnvoll ist.

Jetzt habe ich den Code wie unten zu sehen umgeschrieben. Was mich sehr wundert ist, dass der Operator == zwischen postal_code und pal_gebiete
kein Ergebnis bringt. Mit dem in Operator finde ich den passenden Schlüssel, aber der Wert steht in der Ausgabe auf None.

Es wäre toll, wenn ihr mir noch einen Tipp geben könntet. Vielen Dank schonmal!

Code: Alles auswählen

pal_gebiete = {'10000': 'TEXT 1', '25000': 'TEXT 2', '30000': 'TEXT 3'}
with open ("adressen.csv","r") as input_lines_adress, open ("adressen_cz_ausgabe.csv","w") as output:
    
    for entry_adress in input_lines_adress:
        entry_adress = entry_adress.strip().split(";")
        postal_code = (entry_adress[1])
        
        if postal_code in pal_gebiete:
            print (postal_code, pal_gebiete.get(values))
        else:
            print (postal_code, "PLZ_FALSCH")
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: wie man Wörterbücher benutzt, gehört wirklich zu den absoluten Grundlagen. Der Code funktioniert nicht, weil »values« nicht definiert ist. Da eine nichtexistierende PLZ eigentlich ein Fehler ist, solltest Du einfach auf das Wörterbuch zugreifen und den eventuell auftretenden KeyError abfangen.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Guten Morgen zusammen,
so habe ich das jetzt gelöst. Ich bin davon ausgegangen, dass eine Wörterbuch Line direkt ausgelesen werden kann und keine
weitere Schleife zum einlesen benötigt wird.
Jetzt habe ich noch ein kleines Problem. print (entry_adress) zeigt mir alles korrekt an, aber in der adressen_ausgabe.csv wird
der Wert area_code_output immer mit "PLZ_FALSCH" angezeigt.
Woran könnte das jetzt liegen?

Code: Alles auswählen

pal_gebiete = {}                                                
with open ("paletten_gebiete.csv", "r") as entry_pal: 
    for line_pal in entry_pal:
        line_pal_split = line_pal.strip().split(";")
        pal_gebiete[line_pal_split[0]] = line_pal_split[1]
print (pal_gebiete)       

Code: Alles auswählen

for key_palette, value_palette in pal_gebiete.items():

    with open ("adressen_.csv","r") as input_lines_adress, open ("adressen_ausgabe.csv","w") as output:
    
        for entry_adress in input_lines_adress:
            entry_adress = entry_adress.strip().split(";")
            postal_code = (entry_adress[1])
        
            if postal_code == key_palette:
                area_code_output = value_palette
            else:
                area_code_output = "PLZ_FALSCH"
            
            entry_adress.append(area_code_output)
            output.write(";".join(entry_adress) + "\n")
    
            print (entry_adress)
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: ja, auf ein Wörterbuch kann man direkt zugreifen. Mit welchem Tutorial lernst Du denn wie man Wörterbücher benutzt?

Deine doppelte for-Schleife ist ja auch Quatsch. Dass postal_code == key_palette ist, trifft nur auf einen Eintrag im Wörterbuch zu, für alle anderen wird PLZ_FALSCH ausgegeben. Dass an Deinem Programm etwas nicht stimmt, solltest Du eigentlich an der Ausgabe sehen, weil jeder Eintrag zig-mal ausgegeben wird.

Wir können (wollen) Dir hier nicht das Lernen abnehmen. Fang doch mit einfachen Beispielen zu Wörterbüchern an, bis Du verstanden hast, wie man sie benutzt.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Ich hoffe, dass ich jetzt verstanden habe. Den Zugriff auf das Wörterbuch mit "festen" Werten hatte ich ein paar mal im Kurs,
nur bin ich nicht auf die Idee gekommen die Variable dort einzusetzten.

Hier das Ergebnis (die Augabe Daten sehen gut aus):

Code: Alles auswählen

pal_gebiete = {}                                                # pal_gebiete = Datentyp Dictionary
with open ("paletten_gebiete.csv", "r") as entry_pal:           # Zugriff auf .csv (lesen)
    for line_pal in entry_pal:                                  # Schleife beginnen, lesen der .csv (Zeile für Zeile)
        line_pal_split = line_pal.strip().split(";")            # Zeilenumbruch entfernen \n, Werte splitten ";"
        pal_gebiete[line_pal_split[0]] = line_pal_split[1]      # pal_gebiete[Schlüssel zuweisen[Index]] = Werte zuweisen[Index]
print (pal_gebiete)                                             # wenn Schleife am Ende, Wörterbuch anzeigen

Code: Alles auswählen

with open ("adressen.csv","r") as input_lines_adress, open ("adressen_ausgabe.csv","w") as output:  # Zugriff auf .csv lesen bzw. schreiben
                                                                
    for entry_adress in input_lines_adress:                     # Schleife beginnen (lesen der input .csv (Zeile für Zeile)
        entry_adress = entry_adress.strip().split(";")          # input Zeilenumbruch entfernen \n, Werte splitten ";"
        postal_code = (entry_adress[1])                         # Wert [Index] aus der Liste in Variable übernehmen
        
        if postal_code in pal_gebiete:                          # wenn die PLZ im Palettenschlüssel vorhanden ist
            area_code_output = pal_gebiete[postal_code]         # dann gebe den jeweiligen Wert des Schlüssels aus [Wert zu dieser Variable]
        else:                                                   # ansonsten
            area_code_output = "PLZ_FALSCH"                     # setze die Variable auf "Falsch"
            
        entry_adress.append(area_code_output)                   # füge der gesamten Liste Zeile für Zeile den jeweiligen Wert hinzu
        output.write(";".join(entry_adress) + "\n")             # schreibe die Daten in das output file, ";" getrennt, \n Zeilenumbruch einfügen
    
        print (entry_adress)
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Hallo zusammen,
ich versuche gerade meine Datei etwas auszubauen. D.h. es gibt nun mehere Werte zu einem Wörterbuch Schlüssel.
Problem ist, dass das Wörterbuch die jeweiligen Werte in ein Tupel packt und ich diese nicht in eine Liste gewandelt bekomme.
Die Liste benötige ich um eine saubere Export Datei zu erstellen.
Ist ein Tupel bei mehreren Werten in einem Wörterbuch der Standart oder mache ich einen Fehler?

Danke Euch!

Code: Alles auswählen

pal_gebiete = {}
with open ("anreicherung.csv", "r") as entry_pal:
    for line_pal in entry_pal:
        line_pal_split = line_pal.strip().split(";")
        pal_gebiete[line_pal_split[3]] = line_pal_split[2], line_pal_split[1], line_pal_split[4], line_pal_split[5], line_pal_split[6], line_pal_split[7]
print (pal_gebiete)

Code: Alles auswählen

with open ("adressen.csv","r") as input_lines_adress, open ("adressen_ausgabe.csv","w") as output:
                                                                
    for entry_adress in input_lines_adress:
        entry_adress = entry_adress.strip().split(";")
        postal_code = (entry_adress[1])
        
        if postal_code in pal_gebiete:
            area_code_output = pal_gebiete[postal_code]
        else:
            area_code_output = "PLZ_FALSCH"
        
        list(area_code_output)
        print (entry_adress + area_code_output)
Das Ergebnis ist:
['Wert', 'Wert', 'Wert'] ('Wert', 'Wert', 'Wert', 'Wert', 'Wert, 'Wert')
Antworten