csv einlesen und in listbox einfügen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Ich lese eine .csv ein. Diese wird in Spalte 1 nach einen Begriff durchsuchen.

ich möchte nun alle Zeilen aus Spalte 2, die in Spalte 1 den gesuchten Begriff beinhalten in einer listbox anzeigen.

Code: Alles auswählen


Komponente = "Test"

with open('Test.csv') as CSV_Störungen:
    StörungenCSV = csv.reader(CSV_Störungen,  delimiter=";")
    
    for row in StörungenCSV:
                                      
        if Komponente in row[0] :
            print (row[1])
            Störung_Liste = row[1]
                        
         for Störung in Störung_Liste:
         Störungen_List.append(Störung)
         self.Störungen_List_Box.insert(0,Störung)


die Print ausgabe ist: xxxdefekt
yyydefekt

also die Wörter werden richtig wiedergegen


wenn ich dieses jetzt in die Listbox einbinde erscheinen die Buchstaben untereinander. (jeder Buchstabe ist eine Auswahl)


Könnt ihr mir helfen die "Störung_Liste" so zu Formatieren das die Begriffe untereinander in der Listbox angezeigt werden.
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

OK erst stundenlang nicht zum ziel gekommen, dann.....
habe es jetzt so gelöst.

Code: Alles auswählen

Störung_Liste = row[1].splitlines()
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Streifenhase1: Das ist keine Lösung sondern noch umständlicher als eh schon ist. `Störung_Liste` ist nämlich gar keine Liste sondern eine Zeichenkette und Du hast da dann eine Schleife drüber geschrieben welche die einzelnen Buchstaben in die Listbox eingefügt hat statt einfach die Zeichenkette als ganzes einzufügen.

Selbst wenn man aus einer Zeichenkette eine Liste mit dieser Zeichenkette machen wollte, wäre ``[zeichenkette]`` wesentlich einfacher als ``zeichenkette.splitlines()`` und auch robuster, denn wenn `zeichenkette` irgendwann einmal einen Zeilenumbruch enthalten sollte, wird's komisch.

Namen schreibt man in Python klein_mit_unterstrichen. Grunddatentypen haben in Namen nichts verloren – schon gar nicht wenn sie nicht einmal stimmen. Statt magischer Indexwerte würde ich die beiden Spaltenwerte an sinnvolle Namen binden.

Bei Textdateien sollte man immer eine explizite Kodierung angeben.

Ungetestet:

Code: Alles auswählen

        gesuchte_komponente = "Test"
        with open("Test.csv", encoding="utf-8") as stoerungen_datei:
            stoerungen = list()
            rows = csv.reader(stoerungen_datei, delimiter=";")
            for komponente, stoerung in rows:
                if gesuchte_komponente in komponente:
                    print(stoerung)
                    self.stoerungen_listbox.insert(0, stoerung)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Danke klappt. bekomme es jetzt nur leider nicht sortiert.

sonst habe ich es immer so gemacht.

Code: Alles auswählen

stoerungen.sort(reverse = True)
und dann hätte ich noch eine Frage... ich habe nun 3 Listbox wenn ich in der 1. und dann in der 2. und zum schluss in der 3. nacheinander etwas auswähle hätte ich gern das die Auswahl Markiert bleibt.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hindert Dich, erst alles in einer Liste zu sammeln, dann zu sortieren und erst danach alles in die Listbox zu schreiben?
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

ich sag mal offen "Unwissenheit" :)

Code: Alles auswählen

 with open('Data/störungen.csv') as stoerungen_datei:
    reader = csv.reader(stoerungen_datei, delimiter = ";")
    
    stoerungen = list()
    
    data = [[row[0], row[1], row[2], row[3], row[4], row[5]] for row in reader]
          
    for stoerungen in data:
        self.Archiev_Störungen_Listbox.insert(0,stoerungen)

das währe der Code

stoerungen sollen nach row[0] sortiert sein


eigentlich sollen zwischen den row´s ein zwischenraum in der Listbox sein wenn ich diesen aber mit Leerzeichen mache ist eine Klammer in der Listbox.
Streifenhase1
User
Beiträge: 90
Registriert: Dienstag 22. Mai 2018, 07:15

Hab es jetzt so einigermaßen hinbekommen

noch was.

und zwar möchte ich aus der excel datei nur die letzten 10 zeilen auslesen und in die Listbox eintragen.

Code: Alles auswählen

data = [[row[0], row[1],row[2],row[3], row[4], row[5]] for row in reader]
row_format =  "{:<12} {:<12} {:<12} {:<12} {:<20} {:<20} "
 
for items in data:
self.Archiev_Störungen_Listbox.insert(0, row_format.format(*items, sp=" "*1))
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

In Deinem Format-String gibt es gar kein `sp`. Und * 1 macht ziemlich wenig.

Und bei CSV-Dateien (hat nichts mit Excel zu tun) kann man nur die ganze Datei lesen und nur die letzten 10 Zeilen behalten.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dabei kann `more_itertools.tail()` hilfreich sein.

``[row[0], row[1],row[2],row[3], row[4], row[5]]`` ist etwas umständlich für ``row[:6]``
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten