json 导入上的 b64 解码读取数据不正确



我正在从 github 为一个类导入 json 数据,当我尝试转换为字典时,值不会保留在键值对中。

这是导入:

from pprint import pprint as pp
import base64
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'])
pp(csv_val)

这样做的结果有原始数据,尽管我不确定"\r"分隔符是什么。显然,它没有正确导入,因为琴弦在不同的点切断,而不是它们应该的。

(b'month,salesrn2013-01-01,14236.9rn2013-02-01,4519.89rn2013-03-01,5569'
b'1.01rn2013-04-01,28295.35rn2013-05-01,23648.29rn2013-06-01,34595.13r'
b'n2013-07-01,33946.39rn2013-08-01,27909.47rn2013-09-01,81777.35rn2013'
b'-10-01,31453.39rn2013-11-01,78628.72rn2013-12-01,69545.62rn2014-01-0'
b'1,18174.08rn2014-02-01,11951.41rn2014-03-01,38726.25rn2014-04-01,341'
b'95.21rn2014-05-01,30131.69rn2014-06-01,24797.29rn2014-07-01,28765.33'

当我稍后尝试使用DictReader读取数据时,它会逐个字母解析所有内容:

import csv
csv_dict = csv.DictReader(str(csv_val))
dict_list = []
for a in csv_dict:
dict_list.append(a):
for a in dict_list:
print(a)

结果如下:

OrderedDict([('b', "'")])
OrderedDict([('b', 'm')])
OrderedDict([('b', 'o')])
OrderedDict([('b', 'n')])
OrderedDict([('b', 't')])
OrderedDict([('b', 'h')])
OrderedDict([('b', ''), (None, [''])])
OrderedDict([('b', 's')])
OrderedDict([('b', 'a')])
OrderedDict([('b', 'l')])
OrderedDict([('b', 'e')])
OrderedDict([('b', 's')])
OrderedDict([('b', '\')])
OrderedDict([('b', 'r')])
OrderedDict([('b', '\')])
OrderedDict([('b', 'n')])
OrderedDict([('b', '2')])
OrderedDict([('b', '0')])
OrderedDict([('b', '1')])
OrderedDict([('b', '3')])
OrderedDict([('b', '-')])
OrderedDict([('b', '0')])
OrderedDict([('b', '1')])
OrderedDict([('b', '-')])
OrderedDict([('b', '0')])
OrderedDict([('b', '1')])
OrderedDict([('b', ''), (None, [''])])
OrderedDict([('b', '1')])
OrderedDict([('b', '4')])
OrderedDict([('b', '2')])
OrderedDict([('b', '3')])
OrderedDict([('b', '6')])
OrderedDict([('b', '.')])
OrderedDict([('b', '9')])
OrderedDict([('b', '\')])
OrderedDict([('b', 'r')])
OrderedDict([('b', '\')])
OrderedDict([('b', 'n')])
OrderedDict([('b', '2')])
OrderedDict([('b', '0')])
OrderedDict([('b', '1')])
OrderedDict([('b', '3')])
OrderedDict([('b', '-')])
OrderedDict([('b', '0')])
OrderedDict([('b', '2')])
OrderedDict([('b', '-')])
OrderedDict([('b', '0')])
OrderedDict([('b', '1')])
OrderedDict([('b', ''), (None, [''])])
OrderedDict([('b', '4')])
OrderedDict([('b', '5')])
OrderedDict([('b', '1')])
OrderedDict([('b', '9')])
OrderedDict([('b', '.')])
...

我查看了 api https://api.github.com/repos/bsullins/data/contents/MonthlySales.csv,响应有一个键,值

download_url:"https://raw.githubusercontent.com/bsullins/data/master/MonthlySales.csv"

这个网址实际上包含csv的原始格式,所以让我们使用它,因为它也减少了代码。

from pprint import pprint as pp
import requests
import io
import csv
response = requests.get('https://raw.githubusercontent.com/bsullins/data/master/MonthlySales.csv')
csv_val = response.text
pp(csv_val)
csv_dict = csv.DictReader(io.StringIO(csv_val))
dict_list = []
for a in csv_dict:
dict_list.append(a)
for a in dict_list:
print(a)

您需要使用StringIO来解析csv_val的字符串值,因为 csv 需要字符串的内存流。请参阅 Python csv。字典阅读器:解析字符串?

最新更新