Code zur CSV Durchsuchung verbessern

Code-Stücke können hier veröffentlicht werden.
Antworten
Deliverenc
User
Beiträge: 12
Registriert: Freitag 7. Januar 2022, 13:22

Hallo zusammen,

Ein Freund von mir und ich haben zusammen den Nachfolgenden Code zur Durchsuchung eines CSV Datei geschrieben. Da die Durchsuchung Spaltenweise erfolgen soll und die Ausgabe soll der Wert in der
Kopfzeile sein und der am Anfang von der Zeile. Auf dem Bild seht ihr die Orginall Tabelle. Die Kopfzeile ist die Zeile 0 und die Erste Spalte ist die Spalte 0. Der Code Funktioniert auch so wie er soll. Ich würde gerne
wissen ob jemand Verbesserungsvorschläge hat, da er mit zu 'Klobig' vorkommt. Eine Umstellung der Tabelle würde ich gerne vermeiden um Fehler vor zu beugen die da durch entstehen können das auch jemand anderes die Tabelle überprüfen kann, ohne das er Umdenken muss.

Code: Alles auswählen

import csv

inputfile="KupferUndEdelstahlrohr.csv"
#in dieser Datei müssen in jeder Zelle Zahlen 
#stehen, bei denen nachkommas mit "." getrennt sind
#Initialize
search=input('Wie groß ist die Leistung des Gerätes? ')
searchfound=False
dataset=[]
row=[]
rowcnt=0
colcnt=0
colmax=0
with open(inputfile, newline='') as csvfile:
    
    table = csv.reader(csvfile, delimiter=';', quotechar='"')
    for rows in table:
        for col in rows:
            row.append(col)
            colcnt=len(rows)
            if colcnt > colmax:
                colmax = colcnt
        colcnt =0
        rowcnt +=1
        dataset.append(rows)
     #Array from csv is now saved in dataset
     #print(list(range(colmax)))
     #print(list(range(rowcnt)))
    for outer in list(range(colmax)):
        if searchfound==False:
            for inner in list(range(rowcnt)):
             #print(dataset[inner][outer])
                if dataset[inner][outer] == "xx":
                    continue

                elif (float(dataset[inner][outer]) >= float(search)) and (outer and inner):
                    print()
                    #print("Die eingegebene Leistung wurden an folgender Position gefunden")
                    #print()
                    #print("Zeile: " + str(inner) +" /"+" Spalte: " + str(outer))
                    #print()
                    print('Die nächstgelegene Leistung beträgt: ' + str(dataset[inner][outer]) + ' kW')
                    print("Der Druckverlust beträgt " + dataset[inner][0] + " mbar/m2")
                    print("Der rohrdurchmesser beträgt " + dataset[0][outer]+ " mm")
                    print()
                    searchfound=True
                    break
Bild
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Mal so am Rande:
Es wird immer angenommen, dass der erste Wert der richtige ist? Ich sehe aber 4, 5, 6, 7 sehr oft in der Tabelle. 61 auch.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Variabeln initialisiert man dann, wenn man sie braucht, und nicht schon viele Zeilen vorher.
`row` enthält irgendwas komisches, was zum Glück auch nicht benutzt wird.
Die Zeilen nach Zeile 20 sind falsch eingerückt, weil da für jeden Eintrag in `rows` etwas gemacht wird, was gar nicht von diesem Eintrag abhängt.
`rows` ist übrigens der Falsche Name für eine Zeile.
`rowcnt` ist überflüssig, da das einfach die Länge der Liste `dataset` ist.
Das with-Statement umfasst viel zu viel Code.
Über Indizes iteriert man nicht, wenn man auch direkt über die Elemente iterieren kann.
Das `range`-Objekt in eine Liste umzuwandeln, ist unnötig.
Du ermittelst die maximale Anzahl der Spalten, gehst dann aber davon aus, dass alle Zeilen gleich viele Elemente haben. Wenn dem so wäre, reicht ja, die Anzahl der Spalten am ersten Eintrag zu ermitteln.
Du prüfst ganz innen, ob Du gerade die erste Spalte oder Zeile anschaust, statt das schon von Anfang an auszuschließen.
Das `continue` ist unnötig.
Strings stückelt man nicht mit + zusammen, sondern nutzt Format-Strings.
Das Programm könnte ein paar Funktionen gebrauchen.

Code: Alles auswählen

import csv

CSV_FILENAME = "KupferUndEdelstahlrohr.csv"

def read_csv(filename):
    with open(inputfile, newline='') as csvfile:
        table = csv.reader(csvfile, delimiter=';', quotechar='"')
        header = next(table)
        return header, list(table)


def search_value(dataset, search):
    for column_index in range(1, len(dataset[0])):
        for row in dataset:
            if row[column_index] == "xx":
                pass
            elif float(row[column_index]) >= search:
                return column_index, row
    raise ValueError("not found")


def main():
    search = float(input('Wie groß ist die Leistung des Gerätes? '))
    
    header, dataset = read_csv(CSV_FILENAME)
    column_index, row = search_value(dataset, search)

    print('Die nächstgelegene Leistung beträgt: {row[column_index]} kW')
    print("Der Druckverlust beträgt {row[0]} mbar/m^2")
    print("Der Rohrdurchmesser beträgt {header[column_index]} mm")


if __name__ == "__main__":
    main()
Deliverenc
User
Beiträge: 12
Registriert: Freitag 7. Januar 2022, 13:22

@sparrow

Das ist richtig die erste Zahl ist die richtige. Das die zum Teil doppelt sind hat für was anderes bewandnis.

@Sirius3
Danke für deine Tipps. Das hilft mir ungemein auch für zukünftige Projekte.
Antworten