Python 错误:迭代器应该返回字符串,而不是字节

Python 错误:迭代器应该返回字符串,而不是字节,python,python-3.x,csv,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) 在Py

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行,在 对于读取中的行: _错误:迭代器应该返回字符串,而不是字节(您是否以文本模式打开了文件?)


如何修复它?

您可以以文本模式打开文件

更具体地说:

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

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

您的问题是您在
open
标志中有
b
。 标志
rt
(读取,文本)是默认值,因此,使用上下文管理器,只需执行以下操作:

with open('sample.csv') as ifile:
    read = csv.reader(ifile) 
    for row in read:
        print (row)  
上下文管理器意味着您不需要一般的错误处理(没有它,您可能会被文件打开卡住,尤其是在解释器中),因为它会在出现错误或退出上下文时自动关闭文件

以上内容同:

with open('sample.csv', 'r') as ifile:
    ...


它引发该异常的原因是因为您有参数
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)

我在运行使用Python2.6.4开发的旧python脚本时遇到了这个错误


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

在Python3中,
csv.reader
期望传递的iterable返回字符串,而不是字节。下面是解决此问题的另一个解决方案,它使用
编解码器
模块:

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

只是想补充一点,如果在尝试从CSV文件读取/写入CSV文件时出现编码错误,添加特定编码可能会有所帮助。我刚刚通过添加“encoding='utf-8'”修复了我的这个bug。请注意,这个选项不是最安全的。如果你能使用TextIOWrapper,你应该。问题描述:解决方案:谢谢!我们在Python3上遇到了这个问题。
with
语句a.k.a.上下文管理器与这个问题毫无关系@RayLuo在演示文件处理时,我还将演示与此相关的最佳实践。我一直这样做。如果您是Python新手,并且在交互式会话中遇到了一个无法处理的文件,您会非常感激我的建议。。。
import csv
import codecs
ifile  = open('sample.csv', "rb")
read = csv.reader(codecs.iterdecode(ifile, 'utf-8'))
for row in read :
    print (row)