leere/unvollst. Zeilen in einer CSV Datei ignorieren

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
projektor
User
Beiträge: 5
Registriert: Mittwoch 25. November 2009, 13:50

Hallo!

ich versuche, eine 3-spaltige CSV Datei einzulesen (int, int, str). Diese enthält strukturbedingt leere Zeilen sowie unvollständige Datensätze. Die eingelesenen Daten sollen in die entsprechenden Datentypen umgewandelt und weiterverarbeitet werden. Die unvollständigen Datensätze sollen jedoch ignoriert werden.

Mein bisheriger Code sieht so aus:

Code: Alles auswählen

import csv
import sys

#Zugriffsversuch

class myclass:
    def liste(self):
        try:
            d=open("fwpf_nachfrage.csv")
        except:
            print("funzt nicht")
            sys.exit(0)

        #Lesen des Textes
        text=d.read()

        #schliessen
        d.close()

        #umwandeln
        zeilenliste = text.split(chr(10))


        li = []
        for zeile in zeilenliste:
            if zeile:
                zwliste=zeile.split(";")
                li.append([int(zwliste[0]),int(zwliste[1]),zwliste[2]])
        return li


Was müsste ich ändern? Bitte um Hilfestellung.
Danke!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Erstmal solltest du dir das [mod]csv[/mod]-Modul anschauen ;-)
Das Leben ist wie ein Tennisball.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Das csv-Modul hast Du ja schon gefunden und importiert, wenn Du es jetzt noch benutzt, wird der Aufwand übersichtlich:

Code: Alles auswählen

def liste():
    with open(<datei>) as f:
        return [i for i in csv.reader(f) if len(i)==3]
Dem csv.reader kannst noch die Feldtrennung Deiner csv-Datei bekanntmachen, siehe [mod]csv[/mod].
Sollte len(i)==3 nicht das richtige Entscheidungkriterium sein, weil z.B. das Datum angelegt aber leer ist, müsstest Du hier explizit auf den Inhalt der Felder prüfen (z.B. if i[0]!='' usw.)
Evtl. nötige Feldkonvertierungen kannst Du auch "inplace" machen, einfach das erste i durch [int(i[0]), int(i[1]), i[2]] ersetzen.
amiganer68
User
Beiträge: 18
Registriert: Mittwoch 1. Juli 2009, 14:20

jerch hat geschrieben:

Code: Alles auswählen

def liste():
    with open(<datei>) as f:
        return [i for i in csv.reader(f) if len(i)==3]
[...]
Einfach nur einen Kommentar zum Code: Ich finde es immerwieder faszinierend, wie kurz Python doch sein kann und doch noch leserlich.

Christian
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Jo, aber an der Stelle

Code: Alles auswählen

class myclass:
    def liste(self):
Solltest Du, projektor, mal einen Blick ins Tutorial und in PEP8 werfen - sonst ist es mit der Lesbarkeit bald vorbei ...

HTH
noch ein Christian
Antworten