web-dev-qa-db-fra.com

csv.Error: l'itérateur doit renvoyer des chaînes, pas des octets

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 en Python, j'obtiens l'exception suivante:

Le fichier "csvformat.py", ligne 4, dans la ligne en lecture: _csv.Error: iterator doit renvoyer des chaînes, et non des octets (avez-vous ouvert le fichier en mode texte?)

Comment puis-je le réparer?

132
user1094976

Vous ouvrez le fichier en mode texte.

Plus précisement:

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

Les bonnes suppositions pour l'encodage sont "ascii" et "utf8". Vous pouvez également laisser le codage désactivé et utiliser le codage par défaut du système, qui a tendance à être UTF8, mais peut être autre chose.

188
Lennart Regebro

Je viens de résoudre ce problème avec mon code. La raison pour laquelle cette exception est levée est que vous avez l'argument rb. Changez cela en r.

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)
80
MMM

Votre problème est que vous avez le b dans le drapeau open. Le drapeau rt (lecture, texte) est la valeur par défaut. Pour ce faire, utilisez simplement le gestionnaire de contexte:

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 gestion d'erreur générique (sans laquelle vous pouvez rester bloqué avec le fichier ouvert, en particulier dans un interpréteur), car il ferme automatiquement le fichier en cas d'erreur ou de sortie du contexte.

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

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

ou

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

En Python3, csv.reader s'attend à ce que ce qui a été passé soit renvoyé par des chaînes, pas des octets. Voici une autre solution à ce problème, qui utilise le module codecs:

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

J'ai eu cette erreur lors de l'exécution d'un ancien script python développé avec Python 2.6.4

Lors de la mise à jour vers la version 3.6.2, je devais supprimer tous les paramètres 'rb' des appels open afin de corriger cette erreur de lecture csv.

6
Michael Fayad