2011-12-15 26 views
77

Sample.csvは、私はPythonで上記のコードを実行すると、以下のcsv.Error:イテレータは文字列を返すべきではなく、バイト

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

とPythonファイルには、次のコード

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

が含まれて含まれています私は次の例外があります

File "csvformat.py", line 4, in for row in read : _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

どうすれば修正できますか?

答えて

114

ファイルをテキストモードで開きます。

具体的に:エンコーディングの

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

良いの推測は "ASCII" と "UTF8" です。エンコーディングをオフのままにしておくこともできます。これは、UTF8の傾向にあるシステムのデフォルトエンコーディングを使用しますが、それ以外の場合もあります。

+2

CSVファイルを読み書きする際にエンコードエラーが発生した場合は、特定のエンコーディングを追加すると役立ちます。私は "encoding = 'utf-8'"を追加するだけでこのバグを修正しました。 – covfefe

10

あなたの問題はがopenにあることです。 フラグrtは(、テキストを読んで)デフォルトなので、コンテキストマネージャを使用して、単純に次の操作を行います。

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

コンテキストマネージャを使用すると、取り扱い一般的なエラーを必要としないことを意味します(あなたが動けなくなる可能性があるなし特にインタプリタでファイルを開いた状態で)、エラーが発生すると自動的にファイルを閉じたり、コンテキストを終了したりするためです。私はちょうど私のコードでこの問題を修正

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

または

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

上記と同じです。その例外をスローする理由は、引数がrbであるためです。これをrに変更します。

あなたのコード:

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

新コード:

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

3.6.2に更新する場合はPython 2.6.4

で開発し、古いPythonスクリプトを実行しているとき、私は、このエラーが発生しましたこのcsv読み取りエラーを修正するために、オープンコールからすべての 'rb'パラメータを削除する必要がありました。

関連する問題