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

如何用Python 3.x从远程URL打印CSV内容?解决迭代器报错

解决CSV读取时"iterator should return strings, not int"的报错

我来帮你搞定这个问题!先看看你遇到的报错:

Error Traceback (most recent call last) in ()
----> 1 for row in cr:
2 print(row)
Error: iterator should return strings, not int (did you open the file in text mode?)

你的代码思路没问题,但问题出在urllib3返回的响应数据是字节类型,而csv.reader需要的是能返回字符串的迭代器,直接传字节对象的话,它会把每个字节当成单独的整数来处理,自然就报错了。

下面给你两种可行的修改方案:

方案一:解码字节并按行分割

把获取到的字节数据解码成字符串,再按换行符分割成列表,传给csv.reader:

import csv
import urllib3

medals_url = "http://winterolympicsmedals.com/medals.csv"
http = urllib3.PoolManager()
r = http.request("GET", medals_url)

# 把字节数据解码为UTF-8字符串,再按行分割
response_str = r.data.decode('utf-8')
rows = response_str.splitlines()
cr = csv.reader(rows)

for row in cr:
    print(row)

方案二:用io.StringIO包装成类文件对象

这种方式更贴近本地文件读取的逻辑,用io.StringIO把解码后的字符串包装成类文件对象,让csv.reader像读取本地文本文件一样处理它:

import csv
import urllib3
import io

medals_url = "http://winterolympicsmedals.com/medals.csv"
http = urllib3.PoolManager()
r = http.request("GET", medals_url)

# 解码后用StringIO包装成类文件对象
response_file = io.StringIO(r.data.decode('utf-8'))
cr = csv.reader(response_file)

for row in cr:
    print(row)

两种方案都能解决问题,推荐第二种,因为它更符合csv模块的设计习惯,后续如果要用到csv.DictReader这类工具也能直接兼容。

内容的提问来源于stack exchange,提问作者Omar Murcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:23:27