You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python读取URL中CSV数据报错:iterator should return strings, not bytes如何解决?

问题:Python读取远程CSV文件时抛出「iterator should return strings, not bytes」异常

我有一段Python代码,想从远程URL读取CSV数据:

import csv
import urllib.request
url = "https://gist.githubusercontent.com/aparrish/cb1672e98057ea2ab7a1/raw/13166792e0e8436221ef85d2a655f1965c400f75/lebron_james.csv"
stats = list(csv.reader(urllib.request.urlopen(url)))

运行这段代码时,出现了如下异常:

Error
Traceback (most recent call last) in ()
1 url = "https://gist.githubusercontent.com/aparrish/cb1672e98057ea2ab7a1/raw/13166792e0e8436221ef85d2a655f1965c400f75/lebron_james.csv"
----> 2 stats = list(csv.reader(urllib.request.urlopen(url)))

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

请问该如何解决这个问题?

解决方案

嘿,这个问题我之前也碰到过!核心原因很简单:urllib.request.urlopen()返回的是字节流对象,而csv.reader()认的是文本模式的可迭代对象(得返回字符串而不是字节)。给你两种靠谱的解决办法:

方法一:用io.TextIOWrapper包装字节流

直接把字节流转换成文本模式的文件对象就行,记得指定编码(一般用UTF-8就没问题):

import csv
import urllib.request
import io

url = "https://gist.githubusercontent.com/aparrish/cb1672e98057ea2ab7a1/raw/13166792e0e8436221ef85d2a655f1965c400f75/lebron_james.csv"
response = urllib.request.urlopen(url)
# 把字节流包装成文本模式对象,指定编码
text_stream = io.TextIOWrapper(response, encoding='utf-8')
stats = list(csv.reader(text_stream))

方法二:手动解码字节内容

先把所有字节读出来,解码成字符串,再用io.StringIO包装成csv能处理的文本流:

import csv
import urllib.request
import io

url = "https://gist.githubusercontent.com/aparrish/cb1672e98057ea2ab7a1/raw/13166792e0e8436221ef85d2a655f1965c400f75/lebron_james.csv"
response = urllib.request.urlopen(url)
# 读取字节并解码为字符串
csv_content = response.read().decode('utf-8')
# 用StringIO把字符串转成文本流
stats = list(csv.reader(io.StringIO(csv_content)))

额外小技巧:用requests库简化操作(可选)

如果你的项目允许安装第三方库,requests能让这个过程更省心,它直接返回文本内容,不用自己折腾解码:

import csv
import requests
from io import StringIO

url = "https://gist.githubusercontent.com/aparrish/cb1672e98057ea2ab7a1/raw/13166792e0e8436221ef85d2a655f1965c400f75/lebron_james.csv"
response = requests.get(url)
stats = list(csv.reader(StringIO(response.text)))

内容的提问来源于stack exchange,提问作者Szuyu Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:27:18