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:迭代器应该返回字符串,而不是字节的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“迭代器应该返回字符串,而不是字节”

为啥 min_element() 返回最小元素的索引,而不是迭代器?

python迭代器

python三大器

迭代器生成器和装饰器

为啥返回一个迭代器低耦合(OOP)?