Daten in einer mysql Tabelle sortieren

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
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: 17711
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: 17711
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: 17711
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: 17711
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')
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: das ist sicher nicht das Ergebnis, das Du erhältst, weil man eine Liste und ein Tuple nicht mit + verbinden kann. Du machst doch selbst ein Tuple (ein oder mehrere Werte, die mit Komma getrennt in dein Wörterbuch eingetragen werden). Wenn Du eine Liste willst, mußt Du eckige Klammern verwenden.

Ich glaube Dir hat man schon hundert mal gesagt, dass man zum Lesen und Schreiben von csv-Dateien das csv-Modul nehmen sollte. `area_code_output` einmal ein Tuple und einmal einen String zuzweisen ist ein Fehler. Funktionsaufrufe, die mit dem Ergebnis nichts machen und auch sonst keine Seiteneffekte haben, sind nutzlos. Vor öffnenden Klammern bei Funktionsaufrufen gehört kein Leerzeichen.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

Hallo zusammen,
ich habe den Code jetzt angepasst und hoffe dieser ist soweit konform.
Vom Ergebnis her bin ich sehr zufrieden.
Danke für Eure Hilfe!

Code: Alles auswählen

import csv

pal_gebiete = {}
with open("anreicherung_small.csv") as entry_pal:
    line_pal = csv.reader(entry_pal, delimiter=";")
    for line in line_pal:
        pal_gebiete[line[1]] = [line[2]]  + [line[3]] +  [line[4]] + [line[5]] + [line[6]] + [line[7]] + [line[8]]
print (pal_gebiete)

Code: Alles auswählen

import csv

with open("adressen.csv","r") as input, open("zip_ok.csv","w", newline="") as output_ok, open("zip_error.csv","w", newline="") as output_error:
    entry_address = csv.reader(input, delimiter=";")                                                          
    for address_line in entry_address:
        postal_code = address_line[1]
        
        if postal_code in pal_gebiete:
            area_code_output_ok = pal_gebiete[postal_code]
            database_chained_ok = address_line + area_code_output_ok
            database_output_ok = csv.writer(output_ok, delimiter=";")
            database_output_ok.writerow(database_chained_ok)
            
        else:
            database_output_error = csv.writer(output_error, delimiter=";")
            database_output_error.writerow(address_line)
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: wenn man eine Liste aus Einzelwerten bauen will, dann macht man das nicht, indem man viele Liste mit einem Element erzeugt und diese per + zusammenstückelt. Du willst `line[2:]` benutzen. In jedem Schleifendurchgang einen csv-Writer zu erzeugen ist falsch. in den Variablennamen den if-Zweig hineinzukodieren, in dem sie gerade definiert werden, ist unsinnig.
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

@Sirius3. Danke für deine Hinweise, ich werde es anpassen.
Ich habe noch eine Frage.

Gegeben ist folgende Tabelle.
['10000', 'Ort1']
['10000', 'Ort1']
['10000', 'Ort1']
['10000', 'Ort1']
['10000', 'Ort1']
['10100', 'Ort2']
['10100', 'Ort2']
['10100', 'Ort2']

Ich möchte einen Zähler einbauen, der die jeweilige PLZ aufsteigend zählt. Im besten Fall bekomme ich
auch noch ein Flag, wenn eine PLZ endet.

Ziel Tabelle:
['10000', 'Ort1', '1', '']
['10000', 'Ort1', '2', '']
['10000', 'Ort1', '3', '']
['10000', 'Ort1', '4', '']
['10000', 'Ort1', '5', 'x']
['10100', 'Ort2', '1', '']
['10100', 'Ort2', '2', '']
['10100', 'Ort2', '3', 'x']

Ist es möglich, den Wert in einer Liste aus zwei Zeilen miteinander zu vergleichen?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@tz_wuerzburg: ja, man muß es nur programmieren.
Antworten