Próbuję odczytać ciąg znaków Openstreetmaps API wyjściowy JSON, który jest poprawny."Oczekiwany ciąg znaków lub kod Unicode" podczas odczytu JSON z Pandami
używam następujący kod:
import pandas as pd
import requests
# Links unten
minLat = 50.9549
minLon = 13.55232
# Rechts oben
maxLat = 51.1390
maxLon = 13.89873
osmrequest = {'data': '[out:json][timeout:25];(node["highway"="bus_stop"](%s,%s,%s,%s););out body;>;out skel qt;' % (minLat, minLon, maxLat, maxLon)}
osmurl = 'http://overpass-api.de/api/interpreter'
osm = requests.get(osmurl, params=osmrequest)
osmdata = osm.json()
osmdataframe = pd.read_json(osmdata)
który rzuca następujący błąd:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-66-304b7fbfb645> in <module>()
----> 1 osmdataframe = pd.read_json(osmdata)
/Users/paul/anaconda/lib/python2.7/site-packages/pandas/io/json.pyc in read_json(path_or_buf, orient, typ, dtype, convert_axes, convert_dates, keep_default_dates, numpy, precise_float, date_unit)
196 obj = FrameParser(json, orient, dtype, convert_axes, convert_dates,
197 keep_default_dates, numpy, precise_float,
--> 198 date_unit).parse()
199
200 if typ == 'series' or obj is None:
/Users/paul/anaconda/lib/python2.7/site-packages/pandas/io/json.pyc in parse(self)
264
265 else:
--> 266 self._parse_no_numpy()
267
268 if self.obj is None:
/Users/paul/anaconda/lib/python2.7/site-packages/pandas/io/json.pyc in _parse_no_numpy(self)
481 if orient == "columns":
482 self.obj = DataFrame(
--> 483 loads(json, precise_float=self.precise_float), dtype=None)
484 elif orient == "split":
485 decoded = dict((str(k), v)
TypeError: Expected String or Unicode
Jak zmodyfikować wniosek lub Pandy read_json
, aby uniknąć błędu? A propos, w czym problem?
Wielki wyjaśnienie !! Rozumiem to doskonale, ale nie mogłem rozwiązać mojej zagadki. Dzięki! W wierszu 'osmdata = json.loads (osm.read())' może być coś niepoprawnego, ponieważ dostaję: 'AttributeError: 'Obiekt odpowiedzi' nie ma atrybutu 'read'' – Balzer82
To musi być' osmdata = json.loads (osm.content) ' – Balzer82
@ Balzer82: Moja wersja żądań była za stara; API zmieniło się od tego czasu. Zaktualizowałem przez 'requests' i edytuję powyższy kod. – unutbu