csv.Error:迭代器应该返回字符串,而不是字节
Posted
技术标签:
【中文标题】csv.Error:迭代器应该返回字符串,而不是字节【英文标题】:csv.Error: iterator should return strings, not bytes 【发布时间】:2012-01-20 20:26:18 【问题描述】: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 行,在 对于 read 中的行: _csv.Error: 迭代器应该返回字符串,而不是字节(你是否以文本模式打开文件?)
我该如何解决?
【问题讨论】:
【参考方案1】:您以文本模式打开文件。
更具体地说:
ifile = open('sample.csv', "rt", encoding=<theencodingofthefile>)
编码的好猜测是“ascii”和“utf8”。您也可以关闭编码,它将使用系统默认编码,通常是 UTF8,但也可能是其他编码。
【讨论】:
只是想补充一点,如果您在尝试读取/写入 CSV 文件时遇到编码错误,添加特定编码会有所帮助。我刚刚通过添加“encoding = 'utf-8'”修复了我的这个错误。【参考方案2】:它抛出异常的原因是你有参数rb
,它以二进制模式打开文件。将其更改为r
,默认情况下会在text mode 中打开文件。
您的代码:
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)
【讨论】:
【参考方案3】:在 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)
【讨论】:
请注意,此选项不是最安全的。如果你可以使用 TextIOWrapper,你应该这样做。问题描述:iterdecode eats empty stringsiterdecode isn't safe with multi-byte characters 解决方法:TextIOWrapper on a csv stream 谢谢!在 Python3 上遇到了这个问题。 @Grigoriy Mikhalkin 我对编解码器解决方案表示赞赏,它只是解决了流式传输存储在 S3 中的 csv 文件的问题,而 csv.reader 不喜欢没有编解码器的情况。【参考方案4】:您的问题是open
标志中有b
。
标志 rt
(read, text) 是默认值,因此,使用上下文管理器,只需执行以下操作:
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 在演示文件处理时,我还将演示围绕它的最佳实践。我相当一致地这样做。如果您是 Python 新手,并且您在交互式会话中遇到了无法处理的文件,您会很感激我的建议...【参考方案5】:
运行使用 Python 2.6.4 开发的旧 Python 脚本时出现此错误
更新到 3.6.2 时,我必须从 open 调用中删除所有 'rb' 参数以修复此 csv 读取错误。
【讨论】:
以上是关于csv.Error:迭代器应该返回字符串,而不是字节的主要内容,如果未能解决你的问题,请参考以下文章