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?
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.
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)
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:
...
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)
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.