Seite 1 von 1

Inhalt einer csv-Datei vergleichen

Verfasst: Donnerstag 16. April 2020, 12:54
von yanke97
Hallo zusammen,

ich bin Pythonneuling und mache gerade meine ersten Schritte. Ich arbeite gerade an einer Funktion die in Abhängigkeit einer ersten Variable eine csv-Datei im Lesemodus öffnet. Danach soll in Abhängigkeit einer zweiten Variable ein Wert aus dieser Datei ausgelesen und mittels einer return-Anweisung ausgegeben werden. Das öffnen der Datei klappt soweit. Aber das auslesen nicht, der Variablenvergleich in der if-Anweisung funktioniert nicht und es immer die else-Anweisung ausgeführt. Woran liegt das ? Ich habe ein ähnliches Pogramm geschrieben da hat es funktioniert.

Vielen Dank für eure Hilfe.

[ import csv
def read_Rm(matkat, mat):
if matkat == "Baustähle unlegiert":
path = "G:\Programmieren\Programm\Materialien\Baustaehle_unlegiert_Rm.csv"
file = open(path, "r")
for content in file:
zeile = content.strip().split(";")
if zeile[0] == str(mat):
return zeile[1]

else:
return "Error"

elif matkat == "Einsatzstähle":
pass

elif matkat == "Nitrierstähle":
pass

elif matkat == "hochlegierte Stähle":
pass

else:
pass

print(read_Rm("Baustähle unlegiert", "S355K2")) ]

csv-Datei:
S235JR;360
S235J0;360
S235J2;360
S275JR;410
S275J0;410
S275J2;410
S355JR;470
S355J0;470
S355J2;470
S355K2;470
S450J0;550
S185;290
E295;470
E355;570
E360;670

Re: Inhalt einer csv-Datei vergleichen

Verfasst: Donnerstag 16. April 2020, 13:18
von ThomasL
Dein Programm macht es so wie du es programmiert hat. Es liest die csv-Datei Zeile für Zeile ein und vergleicht den ersten Wert mit dem Parameter und wenn das nicht stimmt, gibt es "Error" aus. Wenn du also diese Ausgabe "Error" nicht haben willst, lass sie weg. :-)

Den Code kann man so verbessern, unter der Voraussetzung, dass die csv-Datei immer nur die 2 Spalten hat.

Code: Alles auswählen

import csv

def read_Rm(matkat, mat):
    if matkat == "Baustähle unlegiert":
        path = "Baustaehle_unlegiert_Rm.csv"
        with open(path, 'r') as file:
            for content in file:
                name, wert = content.strip().split(";")
                if name == mat:
                    return wert

print(read_Rm("Baustähle unlegiert", "S355K2"))

Re: Inhalt einer csv-Datei vergleichen

Verfasst: Donnerstag 16. April 2020, 14:01
von Sirius3
@ThomasL: csv ist ein überraschend komplexes Dateiformat, weshalb man CSV-Dateien immer mit dem csv-Modul lesen sollte. Eine Funktion sollte in jedem Fall ein explizites return haben und nicht mal implizit None zurückliefern.

@yanke97: csv wird importiert, aber dann gar nicht benutzt. Text-Dateien sollte man immer mit dem passenden Encoding öffnen. Dateien sollte man auch wieder schließen, am besten, indem man das with-Statement benutzt.
Benutze keine Abkürzungen, was soll den rm sein?
Der else-Block bei for ist unnötig, weil in for kein break vorkommt.
Wenn ein Fehler auftritt, sollte man das über eine Exception lösen und nicht durch die Rückgabe eines magischen Strings.
Die anderen Variablen rate ich mal:

Code: Alles auswählen

import csv

FILENAME_BAUSTAEHLE = r"G:\Programmieren\Programm\Materialien\Baustaehle_unlegiert_Rm.csv"

def read_rm(material_kategorie, material):
    if material_kategorie == "Baustähle unlegiert":
        with open(FILENAME_BAUSTAEHLE, encoding='ASCII') as input:
            rows = csv.reader(input)
            for row in rows:
                if row[0] == material:
                    return row[1]
            raise KeyError(material)
    raise ValueError("unknown categorie")
Ich hoffe mal, die Funktion read_rm wird nur für ein Material aufgerufen, sonst ist es ziemlich ineffizient, eine Datei komplett zu lesen, nur um eine Zeile herauszufiltern.

Re: Inhalt einer csv-Datei vergleichen

Verfasst: Donnerstag 16. April 2020, 19:18
von __blackjack__
Und bei CSV-Dateien immer mit ``newlines=""`` öffnen.

Re: Inhalt einer csv-Datei vergleichen

Verfasst: Sonntag 19. April 2020, 20:28
von yanke97
Vielen Dank für eure Antworten. Ich weiß nicht genau woran es lag aber es funktioniert jetzt. Dafür habe ich ein anderes Problem. Und zwar würde ich gerne die Funktion von oben (Rm) in einem Programm aufrufen und die Eingabewerte aus einer Combobox entnehmen. Dafür spreche ich mit bind() eine eventgetriggerte Funktion an die dann mittels get() die ausgewählten Werte aus der Combobox ausliest. Wenn ich dann das Programm ausführe habe ich wieder das gleiche Problem wie oben, der Vergleich zum öffnen der csv-Datei funktioniert ohne Probleme aber der Vergleich während des Zeilenweisen einlesens funktioniert nicht und der Rückgabewert ist None, da ich die else-Bedingung gestrichen habe.
Warum funktioniert das Programm wenn ich die Variablen händisch eingebe aber sobald diese automatische Übergeben werden nicht mehr. Der Datentyp der Variablen ist string, wie es die Funktion eigentlich benötigt und ich kann mit den übergebenen Variablen auch alles machen nur der Vergleich funktioniert nicht.

Nochmals Danke für eure Hilfe.

Code: Alles auswählen

import Rm as zugfest

def set_Rm(event):
        lbl_Rm_aus.config(text = str(zugfest.read_Rm(cb_Mat.get())))