csv.Error: Der Iterator sollte Zeichenfolgen zurückgeben, keine Bytes

158

Sample.csv enthält Folgendes:

NAME    Id   No  Dept
Tom     1    12   CS
Hendry  2    35   EC
Bahamas 3    21   IT
Frank   4    61   EE

Die Python-Datei enthält den folgenden Code:

import csv
ifile  = open('sample.csv', "rb")
read = csv.reader(ifile)
for row in read :
    print (row) 

Wenn ich den obigen Code in Python ausführe, erhalte ich die folgende Ausnahme:

Datei "csvformat.py", Zeile 4, in Zeile für read: _csv.Error: Der Iterator sollte Zeichenfolgen und keine Bytes zurückgeben (haben Sie die Datei im Textmodus geöffnet?)

Wie kann ich es reparieren?

Pika der Zauberer der Wale
quelle

Antworten:

214

Sie öffnen die Datei im Textmodus.

Genauer:

ifile  = open('sample.csv', "rt", encoding=<theencodingofthefile>)

Gute Vermutungen für die Codierung sind "ascii" und "utf8". Sie können die Codierung auch weglassen, und es wird die Systemstandardcodierung verwendet, die in der Regel UTF8 ist, aber möglicherweise etwas anderes ist.

Lennart Regebro
quelle
4
Ich möchte nur hinzufügen, dass das Hinzufügen einer bestimmten Codierung hilfreich sein kann, wenn Sie beim Lesen / Schreiben aus / in eine CSV-Datei Codierungsfehler erhalten. Ich habe diesen Fehler gerade durch Hinzufügen von "encoding = 'utf-8'" behoben.
covfefe
96

Ich habe dieses Problem gerade mit meinem Code behoben. Der Grund, warum diese Ausnahme ausgelöst wird, ist, dass Sie das Argument haben rb. Ändern Sie das in r.

Dein Code:

import csv
ifile  = open('sample.csv', "rb")
read = csv.reader(ifile)
for row in read :
    print (row) 

Neuer Code:

import csv
ifile  = open('sample.csv', "r")
read = csv.reader(ifile)
for row in read :
    print (row)
MMM
quelle
29

Ihr Problem ist, dass Sie die bin der openFlagge haben. Das Flag rt(Lesen, Text) ist die Standardeinstellung. Verwenden Sie dazu einfach den Kontextmanager:

with open('sample.csv') as ifile:
    read = csv.reader(ifile) 
    for row in read:
        print (row)  

Der Kontextmanager bedeutet, dass Sie keine generische Fehlerbehandlung benötigen (ohne die Sie möglicherweise bei geöffneter Datei hängen bleiben, insbesondere in einem Interpreter), da die Datei bei einem Fehler oder beim Beenden des Kontexts automatisch geschlossen wird.

Das Obige ist dasselbe wie:

with open('sample.csv', 'r') as ifile:
    ...

oder

with open('sample.csv', 'rt') as ifile:
    ...
Aaron Hall
quelle
Die withAussage alias der Kontextmanager hat überhaupt nichts mit dieser Frage zu tun!
RayLuo
4
@RayLuo Wenn ich die Handhabung von Dateien demonstriere, werde ich auch die Best Practices dafür demonstrieren. Ich mache das ziemlich konsequent. Wenn Sie Python noch nicht kennen und in einer interaktiven Sitzung mit einer Datei stecken bleiben, mit der Sie nichts anfangen können, hätten Sie meinen Rat geschätzt ...
Aaron Hall
24

Erwartet in Python3, csv.readerdass die übergebene iterable Zeichenfolge Zeichenfolgen und keine Bytes zurückgibt. Hier ist eine weitere Lösung für dieses Problem, die codecsModul verwendet:

import csv
import codecs
ifile  = open('sample.csv', "rb")
read = csv.reader(codecs.iterdecode(ifile, 'utf-8'))
for row in read :
    print (row) 
Grigoriy Mikhalkin
quelle
3
Beachten Sie, dass diese Option nicht die sicherste ist. Wenn Sie TextIOWrapper verwenden können, sollten Sie dies tun. Problembeschreibungen : iterdecode frisst leere Zeichenfolgen iterdecode ist mit Multi-Byte-Zeichen nicht sicher Die Lösung: TextIOWrapper auf einem CSV-Stream
kavdev
1
Vielen Dank! war mit diesem Problem auf Python3 konfrontiert.
Kenny Aires
9

Ich hatte diesen Fehler beim Ausführen eines alten Python-Skripts, das mit Python 2.6.4 entwickelt wurde

Beim Update auf 3.6.2 musste ich alle 'rb'-Parameter aus offenen Aufrufen entfernen , um diesen CSV-Lesefehler zu beheben.

Michael Fayad
quelle