#json #python-3.x #pandas
Вопрос:
У меня есть скрипт Python 3.8.5, который получает JSON из API, сохраняет на диск, считывает JSON в DF. Это работает.
df = pd.io.json.read_json('json_file', orient='records')
Вместо этого я хочу попробовать буфер ввода-вывода, чтобы мне не приходилось читать/записывать на диск, но я получаю сообщение об ошибке. Код выглядит так:
from io import StringIO io = StringIO() json_out = [] # some code to append API results to json_out json.dump(json_out, io) df = pd.io.json.read_json(io.getvalue())
На этой последней строке я получаю сообщение об ошибке
File "C:UserschapAnaconda3libsite-packagespandasutil_decorators.py", line 199, in wrapper return func(*args, **kwargs) File "C:UserschapAnaconda3libsite-packagespandasutil_decorators.py", line 296, in wrapper return func(*args, **kwargs) File "C:UserschapAnaconda3libsite-packagespandasiojson_json.py", line 618, in read_json result = json_reader.read() File "C:UserschapAnaconda3libsite-packagespandasiojson_json.py", line 755, in read obj = self._get_object_parser(self.data) File "C:UserschapAnaconda3libsite-packagespandasiojson_json.py", line 777, in _get_object_parser obj = FrameParser(json, **kwargs).parse() File "C:UserschapAnaconda3libsite-packagespandasiojson_json.py", line 886, in parse self._parse_no_numpy() File "C:UserschapAnaconda3libsite-packagespandasiojson_json.py", line 1119, in _parse_no_numpy loads(json, precise_float=self.precise_float), dtype=None ValueError: Trailing data
JSON находится в формате списка. Так что это не настоящий json, но он выглядит так, когда я записываю на диск:
json = [ {"state": "North Dakota", "address": "123 30th st E #206", "account": "123" }, {"state": "North Dakota", "address": "456 30th st E #206", "account": "456" } ]
Учитывая, что это сработало в первом случае (запись/чтение с диска), я не знаю, как устранить неполадки. Как я могу устранить неполадки в буфере? Фактические данные в основном представляют собой текст, но содержат несколько числовых полей.
Ответ №1:
Не знаю, что с тобой происходит не так, для меня это работает:
import json import pandas as pd from io import StringIO json_out = [ {"state": "North Dakota", "address": "123 30th st E #206", "account": "123" }, {"state": "North Dakota", "address": "456 30th st E #206", "account": "456" } ] io = StringIO() json.dump(json_out, io) df = pd.io.json.read_json(io.getvalue()) print(df)
это наводит меня на мысль, что что-то не так с кодом, который добавляет данные API…
Однако, если у вас есть список словарей, вам не нужен шаг ввода-вывода. Вы можете просто сделать:
pd.DataFrame(json_out)
РЕДАКТИРОВАТЬ: Я думаю, что помню эту ошибку, когда в конце моего json была запятая, вот так:
[ { "hello":"world", }, ]
Комментарии:
1. о, я не пробовал pd.DataFrame(json_out); это так просто и, кажется, работает. Спасибо, что указали на очевидное, что я упустил.