Seite 1 von 1

csv lesen geht nicht

Verfasst: Freitag 26. April 2024, 17:36
von Hellstern
Hallo zusammen, irgendwie stehe ich auf dem Schlauch.
Ich möchte eigentlich nur ein csv-File lesen, bekomme aber immer eine Fehlermeldung.
Ich habe es gemacht, wie die Beispiele in diesem Forum.
Das csv-File liegt im selben Ordner wie das Projekt

def readCSV(csv):
writeHistory('csv-File lesen...')
with open('VNXA99.csv', 'r') as file_raw:
data_read = csv.reader(file_raw, delimiter=';')
for zeile in data_read:
print(zeile)


Fehlerhafte Zeile
data_read = csv.reader(file_raw, delimiter=';')

Fehlermeldung
AttributeError: 'str' object has no attribute 'reader'


Gruss
Thomas

Re: csv lesen geht nicht

Verfasst: Freitag 26. April 2024, 17:45
von snafu
Hellstern hat geschrieben: Freitag 26. April 2024, 17:36

Code: Alles auswählen

def readCSV(csv):
    writeHistory('csv-File lesen...')
    with open('VNXA99.csv', 'r') as file_raw:
        data_read = csv.reader(file_raw, delimiter=';')
        for zeile in data_read:
            print(zeile)
Fehlerhafte Zeile

Code: Alles auswählen

data_read = csv.reader(file_raw, delimiter=';')
Fehlermeldung
AttributeError: 'str' object has no attribute 'reader'
Naja, du nimmst ``csv`` als Argument der Funktion an und gleichzeitig willst du den ``reader`` des ``csv``-Moduls aufrufen. An der Stelle wird der Modul-Import, den ich hier mal voraussetze, überschrieben durch das Funktionsargument. Letzteres müsstest du einfach umbenennen in ``csv_file`` oder ähnliches. Dann wird es funktionieren.

Im Übrigen ist dir hoffentlich klar, dass du im gezeigten Code das Funktionsargument gar nicht verwendest...

Re: csv lesen geht nicht

Verfasst: Freitag 26. April 2024, 17:48
von Hellstern
Vielen Dank für die die schnelle Antwort
Das war das Problem, jetzt funktioniert es

Das Funktionsargument habe ich nur zum testen nicht verwendet

Gruss
Thomas

Re: csv lesen geht nicht

Verfasst: Freitag 26. April 2024, 17:50
von __blackjack__
@Hellstern: Tja ganz offensichtlich ist der Name `csv` in der Funktion an eine Zeichenkette gebunden. Wie soll der dann auch gleichzeitig noch für das Modul stehen?

Namen werden in Python übrigens klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Was ist denn überhaupt ein `csv`? Wäre es nicht sinnvoller das `csv_filename` zu nennen, oder nur `filename`, denn der CSV-Teil wird ja durch den Funktionsnamen schon klar.

Beim `csv`-Modul muss man beim öffnen der Datei ``newline=""`` angeben. Siehe Dokumentation des Moduls. Und beim öffnen von Textdateien sollte man die Kodierung explizit angebeben. Sonst muss man hoffen, dass die ”Systemkodierung” zufällig die richtige ist.

`file_raw` ist irgendwie Yoda, denn das wäre eher ein `raw_file`. Wobei das `raw` dieses Dateiobjekt ja nicht irgendwie gegen ein anderes abgrenzt, also reicht `file` aus.

`data_read` ist komisch bis falsch. Da sind noch keine gelesenen Daten, das ist ein iterierbares Objekt das die Datensätze erst liest wenn die angefragt werden, und dann auch jeden einzeln. `zeile` stimmt an sich als Name, aber warum ist *der* Name dann in Deutsch während alle anderen Englisch sind? Das wäre konsistenterweise also `row`.