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:迭代器应该返回字符串,而不是字节(你是否以文本模式打开文件?)
我该如何解决?
答案 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读取错误。