从GitHub导入CSV转字典失败:DictReader逐字符解析异常
解决GitHub API获取CSV后DictReader解析错误的问题
我一眼就看出问题所在了——你在处理字节数据转字符串以及给csv.DictReader传参的时候踩了两个小坑,导致数据被逐字符解析了。让我一步步帮你修正:
问题根源
- 字节转字符串的方式错误:你直接用
str(csv_val)把字节对象转成字符串,这会把字节的表示形式(比如b'month,sales\r\n')转成字符串,也就是得到"b'month,sales\\r\\n'"这种包含b'前缀和转义字符的内容,DictReader会把这个字符串的每个字符当作一个字段。 - 没有提供类文件对象给DictReader:
csv.DictReader需要的是可迭代的行对象(比如打开的文件或StringIO对象),直接传字符串的话,它会把整个字符串当作单行,然后逐字符拆分。
另外,你原来的代码里还有两个语法小问题:导入语句from pprint import pprint as pp后缺少逗号,以及for a in dict_list:后面多了个冒号。
修正后的完整代码
import requests import json import base64 from pprint import pprint as pp import csv from io import StringIO # 获取GitHub API数据 response = requests.get('https://api.github.com/repos/bsullins/data/contents/MonthlySales.csv') response_json = json.loads(response.text) csv_val = base64.b64decode(response_json['content']) # 把字节解码为utf-8字符串,再包装成StringIO类文件对象 csv_str = csv_val.decode('utf-8') csv_file = StringIO(csv_str) # 用DictReader正确解析CSV csv_dict = csv.DictReader(csv_file) dict_list = list(csv_dict) # 打印结果验证 pp(dict_list)
关键步骤解释
csv_val.decode('utf-8'):把GitHub API返回的字节数据解码为标准UTF-8字符串,彻底去掉字节对象的b'前缀和转义问题。StringIO(csv_str):把字符串包装成类文件对象,让csv.DictReader可以像读取本地文件一样逐行解析,自动识别表头和每行的键值对。
验证结果
运行修正后的代码,你会得到正确的字典列表,每个元素都是对应月份的销售数据,比如:
[{'month': '2013-01-01', 'sales': '14236.9'}, {'month': '2013-02-01', 'sales': '4519.89'}, {'month': '2013-03-01', 'sales': '55691.01'}, ...]
内容的提问来源于stack exchange,提问作者diprinzio
相关产品推荐
相关产品推荐

