Daten in einer mysql Tabelle sortieren

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Sirius3
User
Beiträge: 8271
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 7. Februar 2018, 20:48

@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: 38
Registriert: Dienstag 7. März 2017, 17:51

Donnerstag 8. Februar 2018, 09:10

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: 8271
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 8. Februar 2018, 11:02

@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: 38
Registriert: Dienstag 7. März 2017, 17:51

Donnerstag 8. Februar 2018, 14:43

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: 38
Registriert: Dienstag 7. März 2017, 17:51

Mittwoch 28. Februar 2018, 16:49

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: 8271
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 28. Februar 2018, 17:32

@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: 38
Registriert: Dienstag 7. März 2017, 17:51

Montag 12. März 2018, 11:40

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: 8271
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 12. März 2018, 11:53

@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: 38
Registriert: Dienstag 7. März 2017, 17:51

Montag 12. März 2018, 14:08

@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: 8271
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 12. März 2018, 14:18

@tz_wuerzburg: ja, man muß es nur programmieren.
tz_wuerzburg
User
Beiträge: 38
Registriert: Dienstag 7. März 2017, 17:51

Dienstag 3. April 2018, 14:03

@Sirius3: Ich bekomme es nicht gebacken.
Als erstes bekomme ich das hier nicht mit .append verknüpft.

Code: Alles auswählen

area_code_output_ok = address_line + area_code_output
Ergebnis ist dann einmal komplett "None".

Zweitens finde ich keine Lösung für das schreiben in zwei Files außerhalb der Schleife.
Gebe ich "database_error" außerhalb aus, bekomme ich über die komplette Datei solange den
fehlerhaften Datensatz bis der nächste fehlerhafte Datensatz gefunden wird, usw.

Wo finde ich dazu vielleicht ein gutes Handbuch?

Vielen Dank!

Code: Alles auswählen

# -*- coding: utf-8 -*-
import csv

pal_gebiete = {}
with open("anreicherung_utf8.csv", "r", encoding="utf-8") as entry_pal:
    line_pal = csv.reader(entry_pal, delimiter=";")
    for line in line_pal:
        pal_gebiete[line[0]] = line[1:]


database_error = []
area_code_output = []
area_code_output_ok = []

with open("adressen.csv", "r", encoding="utf-8") as input, open("zip_ok.csv", "w", newline="", encoding="utf-8") as output_ok, open(
        "zip_error.csv", "w", newline="", encoding="utf-8") 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 = pal_gebiete[postal_code]
            area_code_output_ok = address_line + area_code_output

            database_output_ok = csv.writer(output_ok, delimiter=";")
            database_output_ok.writerow(area_code_output_ok)

        else:
            database_error = address_line

            database_output_error = csv.writer(output_error, delimiter=";")
            database_output_error.writerow(database_error)

        print(area_code_output_ok)
Sirius3
User
Beiträge: 8271
Registriert: Sonntag 21. Oktober 2012, 17:20

Dienstag 3. April 2018, 14:35

@tz_wuerzburg: append hat kein Ergebnis, weil es die Liste ändert. Und wenn Du bei jedem Datensatz `database_error` in eine Datei schreibst, ist die für jeden Datensatz geschrieben. In jedem Schleifendurchgang einen csv-Writer zu erzeugen ist trotzdem immer noch falsch.
tz_wuerzburg
User
Beiträge: 38
Registriert: Dienstag 7. März 2017, 17:51

Dienstag 3. April 2018, 15:41

@Sirius3. Habe nun verstanden. Der csv.writer ist nun nicht mehr in der Schleife und die Daten
werden sauber geschrieben. Danke!

Code: Alles auswählen

# -*- coding: utf-8 -*-
import csv

pal_gebiete = {}
with open("anreicherung_utf8.csv", "r", encoding="utf-8") as entry_pal:
    line_pal = csv.reader(entry_pal, delimiter=";")
    for line in line_pal:
        pal_gebiete[line[0]] = line[1:]


database_error = []
area_code_output = []
area_code_output_ok = []

with open("adressen.csv", "r", encoding="utf-8") as input, open("zip_ok.csv", "w", newline="", encoding="utf-8") as output_ok, open(
        "zip_error.csv", "w", newline="", encoding="utf-8") as output_error:
    entry_address = csv.reader(input, delimiter=";")
    database_output_ok = csv.writer(output_ok, delimiter=";")
    database_output_error = csv.writer(output_error, delimiter=";")
    for address_line in entry_address:
        postal_code = address_line[1]

        if postal_code in pal_gebiete:
            area_code_output = pal_gebiete[postal_code]
            area_code_output_ok = address_line + area_code_output
            database_output_ok.writerow(area_code_output_ok)

        else:
            database_output_error.writerow(address_line)
Sirius3
User
Beiträge: 8271
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 4. April 2018, 07:07

@tz_wuerzburg: keine der drei Listen, die Du vor dem `with` erzeugst, wird jemals benutzt. Die Zeilen können ersatzlos gelöscht werden.
Antworten