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


159

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:イテレータはバイトではなく文字列を返す必要があります(テキストモードでファイルを開きましたか?)

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

回答:


215

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

すなわち:

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

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


4
これに追加したいのは、CSVファイルの読み取り/書き込みを試行したときにエンコーディングエラーが発生した場合に、特定のエンコーディングを追加すると役立つことです。「encoding = 'utf-8'」を追加して、このバグを修正しました。
covfefe

96

この問題をコードで修正しました。その例外がスローされる理由は、引数があるためです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)

29

あなたの問題は、あなたが持っている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:
    ...

withコンテキストマネージャ別名文はすべてで、この質問とは何の関係もありません!
RayLuo

4
@RayLuoファイル処理のデモンストレーションを行うときは、その周りのベストプラクティスも示します。私はそれをかなり一貫して行います。Python
アーロンホール

24

Python3では、csv.reader反復可能に渡されたものがバイトではなく文字列を返すことを期待しています。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) 

3
このオプションは最も安全ではないことに注意してください。TextIOWrapperを使用できる場合は、使用する必要があります。問題の説明:iterdecodeが空の文字列を食べる iterdecodeはマルチバイト文字では安全ではありません 解決策:csvストリームの
TextIOWrapper

1
ありがとう!Python3でこの問題に直面していました。
ケニーアイレス

9

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.