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

从URL读取CSV时每行含b'前缀,csv.DictReader报错如何解决?

解决csv.DictReader处理字节流报错的问题

问题根源是urllib.request.urlopen()返回的是字节流对象,而csv.DictReader要求输入的是文本模式的可迭代对象(返回字符串而非字节),所以会抛出_csv.Error: iterator should return strings, not bytes异常。

以下两种可行的解决思路:

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

通过io.TextIOWrapper将字节流转换为文本流,指定正确的编码(多数公开CSV使用UTF-8):

import urllib.request
import csv
import io

target_url = 'https://raw.githubusercontent.com/vaastav/Fantasy-Premier-League/master/data/2022-23/gws/gw1.csv'

with urllib.request.urlopen(target_url) as csv_file:
    # 把字节流包装为UTF-8编码的文本流
    text_stream = io.TextIOWrapper(csv_file, encoding='utf-8')
    csv_reader = csv.DictReader(text_stream)
    players = [dict(row) for row in csv_reader]

print(players)

方法2:用codecs.iterdecode逐行解码字节流

使用codecs模块的iterdecode方法,将字节流迭代器直接解码为字符串迭代器:

import urllib.request
import csv
import codecs

target_url = 'https://raw.githubusercontent.com/vaastav/Fantasy-Premier-League/master/data/2022-23/gws/gw1.csv'

with urllib.request.urlopen(target_url) as csv_file:
    # 逐行将字节解码为UTF-8字符串
    csv_reader = csv.DictReader(codecs.iterdecode(csv_file, 'utf-8'))
    players = [dict(row) for row in csv_reader]

print(players)

注意事项

如果CSV文件使用其他编码(比如GBK),需要将代码中的encoding='utf-8'替换为对应编码,否则可能出现乱码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:15:00