b64decode на json импортирует данные чтения неправильно - PullRequest
0 голосов
/ 09 мая 2018

Я импортирую данные json из github для класса, и когда я пытаюсь преобразовать их в словарь, значения не остаются в парах ключ-значение.

Вот импорт:

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 \ n".Ясно, что он не импортировался правильно, так как строки обрезались в разных точках, чем они должны были.

(b'month,sales\r\n2013-01-01,14236.9\r\n2013-02-01,4519.89\r\n2013-03-01,5569'
 b'1.01\r\n2013-04-01,28295.35\r\n2013-05-01,23648.29\r\n2013-06-01,34595.13\r'
 b'\n2013-07-01,33946.39\r\n2013-08-01,27909.47\r\n2013-09-01,81777.35\r\n2013'
 b'-10-01,31453.39\r\n2013-11-01,78628.72\r\n2013-12-01,69545.62\r\n2014-01-0'
 b'1,18174.08\r\n2014-02-01,11951.41\r\n2014-03-01,38726.25\r\n2014-04-01,341'
 b'95.21\r\n2014-05-01,30131.69\r\n2014-06-01,24797.29\r\n2014-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', '.')])
...

1 Ответ

0 голосов
/ 09 мая 2018

Я посмотрел на API https://api.github.com/repos/bsullins/data/contents/MonthlySales.csv, и ответ имеет ключ, значение

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

Этот URL на самом деле содержит необработанный формат 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.DictReader: строка разбора?

...