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


158

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:迭代器应返回字符串,而不是字节(您是否以文本模式打开文件?)

我该如何解决?

Answers:


214

您以文本模式打开文件。

进一步来说:

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

编码的不错猜测是“ ascii”和“ utf8”。您还可以关闭编码,它将使用系统默认编码,该编码通常为UTF8,但可能还有其他含义。


4
只是想补充一下,如果在尝试从CSV文件读写时遇到编码错误,则添加特定的编码会有所帮助。我只是通过添加“ encoding ='utf-8'”修复了我的这个错误。
covfefe

96

我只是用我的代码解决了这个问题。引发该异常的原因是因为您有参数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)

29

您的问题是您bopen标志中。该标志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:
    ...

with又名上下文管理语句无关,与这个问题,在所有!
RayLuo

4
@RayLuo在演示文件处理时,我还将演示有关它的最佳实践。我相当一致地这样做。如果您是Python的新手,并且无法进行任何操作都陷入与文件的交互式会话中,您将不胜感激我的建议...
Aaron Hall

24

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

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

3
请注意,此选项不是最安全的。如果可以使用TextIOWrapper,则应该使用。问题说明:iterdecode会吃掉空字符串 iterdecode使用多字节字符并不安全 解决方案:csv流上的TextIOWrapper
kavdev

1
谢谢!在Python3上遇到了这个问题。
肯尼·艾利斯

9

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.