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
相关产品推荐
相关产品推荐

