ошибка «завершающие данные» при чтении json в фрейм данных Pandas

#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); это так просто и, кажется, работает. Спасибо, что указали на очевидное, что я упустил.