Csv Read und einzelne auswählen

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
Beate
User
Beiträge: 7
Registriert: Mittwoch 7. November 2018, 12:47

Hallo,
ich möchte ein csv einlesen. Dieses hat zwei Spalten. Die erste enthält filenamen also Strings und die zweite Spalte zahlen.
Ich möchte wenn die Zahl >0 ist dann mit dem filenamen weiter machen. D.h. ich denke es ware gut eine Liste der Filenamen zu haben bei denen der Wert in der zweiten spalte im csv >0 ist.
Leider bin ich noch eine sehr blutige Anfängerin, nicht nur was Python betrifft, sondern Progammierung allgemein.

Ich kann die csv importieren und zeilenweise aufrufen.
Ich habe mir überlegt dass ich direct eine Liste generiere- oder bin ich mit einem dictionary besser beraten?

Mich verwirrt gerade diese kommunikation hier viewtopic.php?t=40304 denn hier wird eine Liste erzeugt und das sei aber nicht gut weil es eine hauptsache es tut lösung ist. Dennoch hatte ich es mir eigentlich genauso vorgestellt. Da ich aber meherer 1000 files in meiner Spalte automatisch aussuchen möchte, möchte ich jetzt nicht mit einer Lösung anfangen bei der ich hier schon lesen kann dass sie nicht gut ist.

Was sollte ich denn machen wenn ich es richtig machen will? Tatsächlich ein Dictionary?
Dass die Liste mit Strings und integer gemischt befüllt ist macht mir gerade auch Kopfzerbrechen weil so natürlich befehele wie len(Liste) nicht funktionieren. Für Tipps bin ich euch sehr dankbar!

Viele Grüße! Beate
Benutzeravatar
__blackjack__
User
Beiträge: 14251
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Beate: Das von Dir verlinkte Thema sagt eigentlich hauptsächlich nur das es auf die Form der Eingabedaten und das was man danach damit machen möchte um entscheiden zu können wie eine geignete Datenstruktur aussieht.

Wenn Deine CSV-Datensätze aus jeweils zwei Spalten bestehen dann braucht man nicht zwingend einen `csv.DictReader` weil man bei zwei Werten noch völlig übersichtlich einfach durch Zuweisung eines Datensatzes an zwei gut gewählte Namen noch ein verständliches Programm hinbekommt. Im anderen Thema hatte dagegen jeder Datensatz ganze 16 Elemente, was ziemlich unübersichtlich ist wenn man da magische Indexwerte statt aussagekräftiger Spaltenbezeichner hat.

Wo sind da bei Dir Zeichenketten und ganze Zahlen vermischt so das `len()` nicht mehr funktioniert? Vom `csv.reader()` kommt ja immer eine Liste pro Datensatz die beide Elemente enthält. Selbst wenn Du die dann in eine Liste steckst, würdest Du die ja nicht nacheinander als einzelne Elemente in die Liste stecken, sondern die Liste mit den beiden Elementen als jeweils *ein* Element anhängen.

Was brauchst Du denn nach dem einlesen für die Weiterverarbeitung? Nur die Dateinamen wo der zweite Wert im Datensatz die Bedingung erfüllt, oder auch den Zahlwert zum Dateinamen?
“All tribal myths are true, for a given value of 'true'.” — Terry Pratchett, The Last Continent
Benutzeravatar
__blackjack__
User
Beiträge: 14251
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn man nur die Dateinamen braucht (und der Namen `value` ist ein bisschen zu generisch):

Code: Alles auswählen

#!/usr/bin/env python3
import csv


def main():
    with open('test.csv', encoding='utf-8') as csv_file:
        filenames = [
            filename
            for filename, value in csv.reader(csv_file)
            if int(value) > 0
        ]
    print(filenames)


if __name__ == '__main__':
    main()
“All tribal myths are true, for a given value of 'true'.” — Terry Pratchett, The Last Continent
Beate
User
Beiträge: 7
Registriert: Mittwoch 7. November 2018, 12:47

#####Versuche es mit Pandas da das Filtern kann##########
Auswahl= []
df =[]
df = pd.read_csv("shortinputList_header.csv")
print (df)
Auswahl = df['File'][df['Cycle']> 0].tolist()
print(Auswahl)

Das funktioniert ... JUHU ich habe das alleine gefunden ;-)
Beate
User
Beiträge: 7
Registriert: Mittwoch 7. November 2018, 12:47

HI black jack, deine antwort hat es mir erst jetzt gezeigt... danke für die schelle Antwort. Mein Value ist eine Zahl von -48 bis +48 - aber ich denke ich bin mit der sortier-funktion von pandas erst mal ganz glücklich ist weil es meinem vertrauten excel nahe kommt ;-)
Benutzeravatar
ThomasL
User
Beiträge: 1385
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Beate hat geschrieben: Samstag 23. Februar 2019, 21:00 Auswahl= []
df =[]
diese beiden Zeilen kannst du weglassen, Variablennamen müssen nicht "initialisiert" werden.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten