202 votes

csv.Error : l'itérateur doit retourner des chaînes de caractères, pas des octets

Le fichier Sample.csv contient les éléments suivants :

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

Et le fichier Python contient le code suivant :

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

Lorsque j'exécute le code ci-dessus dans Python, j'obtiens l'exception suivante :

Fichier "csvformat.py", ligne 4, dans for row in read : _csv.Error : iterator should return strings, not bytes (avez-vous ouvert le fichier en mode texte ?)

Comment puis-je le réparer ?

250voto

Lennart Regebro Points 52510

Vous ouvrez le fichier en mode texte.

Plus précisément :

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

De bonnes suppositions pour l'encodage sont "ascii" et "utf8". Vous pouvez également laisser l'encodage désactivé, et il utilisera l'encodage par défaut du système, qui tend à être UTF8, mais peut être autre chose.

119voto

MMM Points 1051

La raison pour laquelle il jette cette exception est que vous avez l'argument rb qui ouvre le fichier en mode binaire. Changez cela en r qui ouvrira par défaut le fichier dans mode texte .

Votre code :

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

Nouveau code :

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

50voto

Grigoriy Mikhalkin Points 1280

Dans Python3, csv.reader s'attend à ce que l'itérable passé renvoie des chaînes de caractères et non des octets. Voici une autre solution à ce problème, qui utilise les méthodes suivantes codecs module :

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

33voto

Aaron Hall Points 7381

Votre problème est que vous avez le b dans le open le drapeau. Le drapeau rt (read, text) est la valeur par défaut, donc, en utilisant le gestionnaire de contexte, faites simplement ceci :

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

Le gestionnaire de contexte signifie que vous n'avez pas besoin de la gestion générique des erreurs (sans laquelle vous pouvez rester coincé avec le fichier ouvert, en particulier dans un interpréteur), car il fermera automatiquement le fichier en cas d'erreur, ou en quittant le contexte.

Ce qui précède est la même chose que :

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

ou

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

11voto

user1283704 Points 613

J'ai eu cette erreur en exécutant un vieux script python développé avec Python 2.6.4

Lors de la mise à jour vers la version 3.6.2, j'ai dû supprimer tous les paramètres "rb" de l'application ouvrir afin de corriger cette erreur de lecture csv.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X