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

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
pythoner
User
Beiträge: 22
Registriert: Dienstag 8. September 2015, 19:58

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?
Danke und Gruß
Pythoner
Benutzeravatar
__blackjack__
User
Beiträge: 14001
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da kommen halt Bytes über die Verbindung. Das sieht nach einem Fall für `io.TextIOWrapper` aus. Wichtig: Das `newline`-Argument nicht vergessen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
pythoner
User
Beiträge: 22
Registriert: Dienstag 8. September 2015, 19:58

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?
Danke und Gruß
Pythoner
Benutzeravatar
__blackjack__
User
Beiträge: 14001
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
pythoner
User
Beiträge: 22
Registriert: Dienstag 8. September 2015, 19:58

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:
Danke und Gruß
Pythoner
Antworten