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

203 投票
7 回答
342975 浏览
提问于 2025-04-17 08:25

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 行,出错位置: for row in read : _csv.Error: 迭代器应该返回字符串,而不是字节(你是以文本模式打开文件的吗?)

我该如何解决这个问题?

7 个回答

50

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

出现这个错误的原因是因为你使用了参数 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)
250

你以文本模式打开文件。

更具体来说:

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

常见的编码方式有“ascii”和“utf8”。你也可以不指定编码,这样它会使用系统默认的编码,通常是UTF8,但也可能是其他编码。

撰写回答