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

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 运行上面的代码时,会得到以下异常:

< p > 文件“ csvformat. py”,第4行,in 行的内容如下: 错误: 迭代器应该返回字符串,而不是字节(是否以文本模式打开文件?)

我该怎么补救?

319076 次浏览

以文本模式打开文件。

更具体地说:

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

编码的好猜测是“ ascii”和“ utf8”。您还可以关闭编码,它将使用系统默认编码,这种编码通常是 UTF8,但也可能是其他编码。

你的问题是 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:
...

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

我在运行使用 Python 2.6.4开发的旧 Python 脚本时出现了这个错误

当更新到3.6.2时,我必须从 打开调用中删除所有‘ rb’参数,以修复这个 csv 读取错误。

在 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)

这是姜戈的 GOTCHA。据我所知,filefield 附带的 open 总是以字节模式打开文件。你需要用 Python 的开场来代替。

因此,使用 avccon _ datafile 作为模型的一个实例,其中包含一个名为 datafile = django.db.model 的字段。FileField () ,下面的代码... 。

with avccount_datafile.datafile.file.open('rt') as fp:
self.avc_data = csv.DictReader(fp)

给出了错误

_csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

但这个可以弥补

filename = avccount_datafile.datafile.file.name
with open(filename, 'rt') as fp:
self.avc_data = csv.DictReader(fp)