csv.Error:迭代器应返回字符串,而不是字节

时间:2011-12-15 04:18:09

标签: python python-3.x csv

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行,in       对于读取行:   _csv.Error:迭代器应该返回字符串,而不是字节(你是否以文本模式打开文件?)

我该如何解决?

5 个答案:

答案 0 :(得分:183)

您以文本模式打开文件。

更具体地说:

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

编码的好猜测是“ascii”和“utf8”。您也可以关闭编码,它将使用系统默认编码,该编码往往是UTF8,但也可能是其他编码。

答案 1 :(得分:74)

我刚用我的代码解决了这个问题。抛出异常的原因是因为你有参数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)

答案 2 :(得分:16)

您的问题是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:
    ...

答案 3 :(得分:9)

在Python3中,csv.reader期望传递可迭代的返回字符串,而不是字节。这是使用codecs模块的此问题的另一种解决方案:

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

答案 4 :(得分:6)

运行使用Python 2.6.4开发的旧python脚本时出现此错误

更新到3.6.2时,我必须从打开调用中删除所有'rb'参数才能修复此csv读取错误。