Seite 1 von 1

leere/unvollst. Zeilen in einer CSV Datei ignorieren

Verfasst: Mittwoch 25. November 2009, 14:05
von projektor
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!

Verfasst: Mittwoch 25. November 2009, 14:22
von EyDu
Hallo.

Erstmal solltest du dir das [mod]csv[/mod]-Modul anschauen ;-)

Verfasst: Mittwoch 25. November 2009, 14:47
von jerch
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.

Verfasst: Mittwoch 25. November 2009, 16:25
von amiganer68
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

Verfasst: Mittwoch 25. November 2009, 16:29
von CM
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