Seite 1 von 1

csv.reader _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

Verfasst: Samstag 7. November 2020, 10:54
von pythoner
Hallo,
ich möchte eine cvs Datei mit Django im Admin Bereich einlesen. Dazu habe ich die folgende Anleitung genutzt.
https://books.agiliq.com/projects/djang ... mport.html

Aber leider bekomme ich folgenden Fehler:

Code: Alles auswählen

File “D:\andreas\Programmierung\Python\bestenliste_laufen\running_results\distances\admin.py”, line 30, in import_csv
for row in reader:
_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)
Ausschnitt vom Code

Code: Alles auswählen

            csv_file = request.FILES["csv_file"]
            reader = csv.reader(csv_file)
            # todo get highest sort number
            sort = 1
            for row in reader:
Ganzer Code:
https://github.com/ad-software/running_ ... s/admin.py

Kann mir bitte jemand helfen? Wieso soll werden die Daten nicht als Stings erfasst?

Re: csv.reader _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

Verfasst: Samstag 7. November 2020, 11:02
von __blackjack__
Da kommen halt Bytes über die Verbindung. Das sieht nach einem Fall für `io.TextIOWrapper` aus. Wichtig: Das `newline`-Argument nicht vergessen.

Re: csv.reader _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

Verfasst: Samstag 7. November 2020, 17:23
von pythoner
Danke für den Hinweis mit io.TextIOWrapper.

Mit folgende Code

if request.method == "POST":
with io.TextIOWrapper(request.FILES["csv_file"], newline='\n') as text_file:
reader = csv.reader(text_file, delimiter=';')
# todo get highest sort number
sort = 1
for row in reader:

bekomme ich aber leider noch den Fehler

File "D:\andreas\Programmierung\Python\bestenliste_laufen\running_results\distances\admin.py", line 37, in import_csv
for row in reader:
ValueError: I/O operation on closed file.

Wo muss ich denn die Datei zum Lesen öffnen?

Re: csv.reader _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

Verfasst: Samstag 7. November 2020, 17:29
von __blackjack__
@pythoner: Die Datei *ist* offen. Dein Problem ist wohl eher das Du sie nicht schliessen solltest, beziehungsweise darauf zugreifen solltest solange sie noch offen ist. Kann man jetzt aber nur raten, weil man in dem Beitrag die Einrückung nicht erkennen kann.

Das `newline`-Argument sollte die leere Zeichenkette gebunden werden. Siehe Dokumentation vom `csv`-Modul. Und die Kodierung würde man besser auch noch angeben.

Re: csv.reader _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

Verfasst: Samstag 7. November 2020, 19:05
von pythoner
Danke für die Hilfe. Jetzt funktioniert es. Mein letzter Fehler war das fehlende Einrücken.

Code: Alles auswählen

            with io.TextIOWrapper(request.FILES["csv_file"], encoding="utf-8", newline='\n') as text_file:
                reader = csv.reader(text_file, delimiter=';')                
                for row in reader: