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

Python3迁移:下载Gzip文件转CSV Reader后仅获首字符问题排查

问题原因与解决方案

嘿,我来帮你排查这个问题!

你遇到的核心问题是传给csv.reader的参数类型不对:
你用fh.read().decode('utf-8')把整个解压后的文件内容转成了一个完整的字符串,但csv.reader需要的是一个能按行迭代的对象(比如文件句柄、行列表这类)。当你传入单个字符串时,它会把字符串里的每个字符当成独立的元素处理,所以遍历出来的每行就只有单个字符了。

修正后的代码(推荐方案)

这个方案用io.TextIOWrapper把二进制的gzip文件对象转换成文本模式的IO对象,让csv.reader可以正常按行读取,而且内存占用更低,适合大文件:

import requests
import io
import gzip
import csv

response = requests.get(feed_url, stream=True)
f = io.BytesIO(response.content)
fh = gzip.GzipFile(fileobj=f)
# 将二进制文件对象转为文本模式IO,适配csv.reader的要求
text_fh = io.TextIOWrapper(fh, encoding='utf-8')
reader = csv.reader(text_fh, delimiter=',', quotechar='"')
for row in reader:
    print(row)
    break

备选方案(适合小文件)

如果你的文件很小,也可以先把内容按行分割成列表再传给csv.reader,但这种方式会一次性把所有内容加载到内存,不适合大文件:

import requests
import io
import gzip
import csv

response = requests.get(feed_url, stream=True)
f = io.BytesIO(response.content)
fh = gzip.GzipFile(fileobj=f)
# 读取所有内容并按行分割
content_lines = fh.read().decode('utf-8').splitlines()
reader = csv.reader(content_lines, delimiter=',', quotechar='"')
for row in reader:
    print(row)
    break

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:31:18