csv.Error: iterator dovrebbe restituire stringhe, non byte


159

Sample.csv contiene quanto segue:

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

E il file Python contiene il seguente codice:

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

Quando eseguo il codice sopra in Python, ottengo la seguente eccezione:

File "csvformat.py", riga 4, in per riga in lettura: _csv.Error: iteratore dovrebbe restituire stringhe, non byte (hai aperto il file in modalità testo?)

Come posso ripararlo?

Risposte:


215

Si apre il file in modalità testo.

Più specificamente:

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

Buone ipotesi per la codifica sono "ascii" e "utf8". Puoi anche disattivare la codifica e utilizzerà la codifica predefinita del sistema, che tende a essere UTF8, ma potrebbe essere qualcos'altro.


4
Voglio solo aggiungere a questo che se ricevi errori di codifica quando provi a leggere / scrivere da / in un file CSV, l'aggiunta di una particolare codifica può aiutare. Ho appena corretto questo bug aggiungendo "encoding = 'utf-8'".
covfefe,

96

Ho appena risolto questo problema con il mio codice. Il motivo per cui sta gettando quell'eccezione è perché hai l'argomento rb. Cambialo inr .

Il tuo codice:

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

Nuovo codice:

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

29

Il tuo problema è che hai bil openflag. Il flag rt(leggi, testo) è l'impostazione predefinita, quindi, usando il gestore del contesto, fai semplicemente questo:

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

Il gestore del contesto significa che non hai bisogno di una gestione generica degli errori (senza la quale potresti rimanere bloccato con il file aperto, specialmente in un interprete), perché chiuderà automaticamente il file in caso di errore o all'uscita dal contesto.

Quanto sopra è uguale a:

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

o

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

La withdichiarazione alias il gestore del contesto non ha assolutamente nulla a che fare con questa domanda!
RayLuo

4
@RayLuo Quando dimostrerò la gestione dei file, dimostrerò anche le migliori pratiche al riguardo. Lo faccio in modo abbastanza coerente. Se non conosci Python e rimani bloccato in una sessione interattiva con un file con cui non puoi fare nulla, avresti apprezzato il mio consiglio ...
Aaron Hall

24

In Python3, csv.readerprevede, che ha superato le stringhe restituite iterabili, non i byte. Ecco un'altra soluzione a questo problema, che utilizza il codecsmodulo:

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

3
Nota che questa opzione non è la più sicura. Se puoi usare TextIOWrapper, dovresti. Descrizioni dei problemi : iterdecode mangia stringhe vuote iterdecode non è sicuro con caratteri multibyte La soluzione: TextIOWrapper su un flusso CSV
kavdev

1
Grazie! stava affrontando questo problema su Python3.
Kenny Aires,

9

Ho avuto questo errore durante l'esecuzione di un vecchio script Python sviluppato con Python 2.6.4

Durante l'aggiornamento a 3.6.2, ho dovuto rimuovere tutti i parametri 'rb' dalle chiamate aperte per correggere questo errore di lettura CSV.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.