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:イテレータはバイトではなく文字列を返す必要があります(ファイルをテキストモードで開きましたか?)
どうすれば修正できますか?
ファイルをテキストモードで開きます。
すなわち:
ifile = open('sample.csv', "rt", encoding=<theencodingofthefile>)
エンコードの適切な推測は「ascii」と「utf8」です。また、エンコーディングをオフのままにしておくと、システムのデフォルトエンコーディングが使用されます。これはUTF8になる傾向がありますが、他のエンコーディングである場合もあります。
この問題をコードで修正しました。その例外をスローしているのは、引数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)
問題は、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:
...
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)
python 2.6.4で開発された古いPythonスクリプトを実行すると、このエラーが発生しました。
3.6.2に更新するとき、このcsv読み取りエラーを修正するために、open呼び出しからすべての 'rb'パラメーターを削除する必要がありました。