web-dev-qa-db-ja.com

csv.Error:イテレータはバイトではなく文字列を返す必要があります

Sample.csvには以下が含まれます。

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) 

上記のコードをPythonで実行すると、次の例外が発生します。

ファイル「csvformat.py」、4行目、読み取りの行:_csv.Error:イテレータはバイトではなく文字列を返す必要があります(ファイルをテキストモードで開きましたか?)

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

122
user1094976

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

すなわち:

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

エンコードの適切な推測は「ascii」と「utf8」です。また、エンコーディングをオフのままにしておくと、システムのデフォルトエンコーディングが使用されます。これはUTF8になる傾向がありますが、他のエンコーディングである場合もあります。

184
Lennart Regebro

この問題をコードで修正しました。その例外をスローしているのは、引数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)
74
MMM

問題は、bフラグに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:
    ...
17
Aaron Hall

Python3では、csv.readerは、iterableを渡すと、バイトではなく文字列を返します。 codecsモジュールを使用する、この問題に対するもう1つの解決策を次に示します。

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

python 2.6.4で開発された古いPythonスクリプトを実行すると、このエラーが発生しました。

3.6.2に更新するとき、このcsv読み取りエラーを修正するために、open呼び出しからすべての 'rb'パラメーターを削除する必要がありました。

6
Michael Fayad