TypeError: lines() takes 1 positional argument but 2 were given

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
tzabbi

Moin Leute,

ich bin gerade dabei Python zu lernen.
Derzeit möchte ich die Objektorientierung verstehen und schreibe einfache Klassen.

Jetzt bin ich bei einem Fehler, den ich derzeit nicht alleine beheben kann. Vielleicht könnt Ihr mir helfen.

Ich habe folgenden Code:

Code: Alles auswählen

class FileReader():
        def __init__(self, dateipfad):
                self.file =  dateipfad
                self.lst = []

        def lines(self):
                with open(self.file) as datei:
                        for line in datei:
                                strng = line.strip()
                                self.lst.append(strng)

                        return self.lst

class CsvReader(FileReader):
        def __init__(self, dateipfad):
                super().__init__(dateipfad)
                self.oberliste = []

        def lines(self):
                super().lines(self)
                for entry in self.lst:
                        print(entry)


f = CsvReader("datei.csv")
print(f.lines())


Daraufhin erscheint folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "08AufgabeVererbung.py", line 27, in <module>
    print(f.lines())
  File "08AufgabeVererbung.py", line 20, in lines
    super().lines(self)
TypeError: lines() takes 1 positional argument but 2 were given

Könnt Ihr mir da helfen?

Ich möchte im Grunde nichts anderes machen, als eine csv-Datei auslesen und diese in einer Liste ausgeben. Es steht in der Datei 3 Werte pro Zeile, die durch ein Komma getrennt sind.

Viele Grüße
tzabbi
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Das 'self' beim Aufruf von 'super().lines()' ist als Parameter nicht erforderlich. (Es gibt auch schon einen fertigen CSVReader in der Standard Library.)
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@tzabby: Vererbung wird in Python recht selten gebraucht, und man schreibt auch nicht für alles Klassen. Deine Klassen sind z.B. im jetzigen Zustand unnötig. Die Klasse FileReader hat als (fast) einzigen Zustand eine Liste und als einzige Methode `lines` eine Funktion, die diese Liste füllt. Damit kann man das einfach als Funktion schreiben:

Code: Alles auswählen

def read_lines(dateipfad):
    with open(dateipfad) as datei:
        return [line.strip() for line in datei]
Für CSVReader gilt eigentlich das selbe, nur eine Funktion, die etwas ausgibt:

Code: Alles auswählen

def print_lines(dateipfad):
    lines = read_lines(dateipfad)
    for entry in lines:
        print(entry)
Weiter gilt das, was kbr schon geschrieben hat: wenn Du einen CSV-Reader willst, nimm csv.reader aus der Standardbibliothek.
Antworten