Tworzenia słownika z odpowiedzi usługi internetowej

0

Cześć,
pierwsze kroki i pierwsze kroki.
Odpytałem usługę, pobrałem dane:

{"type":"FeatureCollection","licence":"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright","features":[{"type":"Feature","properties":{"place_id":331161333,"place_rank":25,"category":"place","type":"postcode","importance":0.12500009999999995,"addresstype":"postcode","name":"00-001","display_name":"Śródmieście Północne, Śródmieście, Warszawa, 00-001, województwo mazowieckie, Polska"},"bbox":[20.8465249,52.0698522,21.1665249,52.3898521],"geometry":{"type": "Point","coordinates": [21.0065248625, 52.22985215]}}]}

chciałbym zapisać w słowniku(?) coś w ten deseń

lista_kodow=('00-001':{dlugosc:20.8465249, szerokosc:52.0698522, nazwa:'Śródmieście Północne, Śródmieście, Warszawa'}, '00-002':{dlugosc:21.84, szerokosc:51.06, nazwa:'jakiś inny randomowy adres''})

Czyli odpytuję różnymi kodami pocztowymi, wybieram długość geograficzną, szerokość geograficzną, nazwę i dodaję do słownika.
Same pobranie danych i przypisanie ich zmiennym mam zrobione i jest ok:

js = json.loads(data)
lng = js['features'][0]['geometry']['coordinates'][0]
lat = js['features'][0]['geometry']['coordinates'][1]

Ale jedynie co mogę to zrobić to to co zawsze w materiałach szkoleniowych np print(lng) :).
A ja chcę pobrać to co interesuje i dodawać do słownika.
Pętla która bierze z listy numery kodów działa i śmiga jak marzenie ;), mam jednak problem z zapisem do zmiennej(zakładam że słownik to byłby najlepsze rozwiązanie na ten etap nauki. Później oczywiście baza danych, albo export do csv, na razie chciałbym nie tylko drukować na ekranie, ale moc zapisać.
Oczywiście nie musi to być słownik, ale skoro ma budowę klucz;wartosc, to chyba najlepiej się do tego nadaje.

0

Durne i niebezpieczne pod wieloma względami rozwiązanie, ale działa:

import json

jsStr = """
{
  "type": "FeatureCollection",
  "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "place_id": 331161333,
        "place_rank": 25,
        "category": "place",
        "type": "postcode",
        "importance": 0.12500009999999995,
        "addresstype": "postcode",
        "name": "00-001",
        "display_name": "Śródmieście Północne, Śródmieście, Warszawa, 00-001, województwo mazowieckie, Polska"
      },
      "bbox": [
        20.8465249,
        52.0698522,
        21.1665249,
        52.3898521
      ],
      "geometry": {
        "type": "Point",
        "coordinates": [
          21.0065248625,
          52.22985215
        ]
      }
    },
        {
      "type": "Feature",
      "properties": {
        "place_id": 331161333,
        "place_rank": 25,
        "category": "place",
        "type": "postcode",
        "importance": 0.12500009999999995,
        "addresstype": "postcode",
        "name": "00-002",
        "display_name": "Bar"
      },
      "bbox": [
        20.8465249,
        52.0698522,
        21.1665249,
        52.3898521
      ],
      "geometry": {
        "type": "Point",
        "coordinates": [
          0.1,
          12
        ]
      }
    }
  ]
}
"""
foo = json.loads(jsStr)
features = [
    {
        f.get("properties").get("name"): {
            "nazwa": f.get("properties").get("display_name"),
            "dlugosc": f.get("geometry").get("coordinates")[0],
            "szerokosc": f.get("geometry").get("coordinates")[1],
        }
    }
    for f in foo.get("features", [])
]
print(features)

Mądrzej by było porozbijać to i sprawdzać czy odpowiednie pola istnieją

0

Dummy

d = {k:v for endpoint in endpoints for k,v in requests.get(f"url/{endpoint}").json().items()}
0
Dregorio napisał(a):

Durne i niebezpieczne pod wieloma względami rozwiązanie, ale działa:

import json
(...)

Mądrzej by było porozbijać to i sprawdzać czy odpowiednie pola istnieją

Zrobiłem wg Twojego kodu i działa:

import urllib.request
import json
import ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
serviceurl = 'https://nominatim.openstreetmap.org/search.php?'
lista_kodow_odpowiedzi={}
parms = dict()
parms['q'] = "springfield"
parms['format'] = 'geojson'
parms['limit'] = 35
url = serviceurl + urllib.parse.urlencode(parms)
print('Pobieranie', url)
uh = urllib.request.urlopen(url, context=ctx)
data = uh.read().decode()
js = json.loads(data)
features = [
    {
        f.get("properties").get("name"): {
            "nazwa": f.get("properties").get("display_name"),
            "dlugosc": f.get("geometry").get("coordinates")[0],
            "szerokosc": f.get("geometry").get("coordinates")[1],
        }
    }
    for f in js.get("features", [])
]
print(features)

By nie było, znalazłem coś w sieci i się uczę.
Tylko w moim przykładzie są trzy pytania(czy raczej tyle pytań ile mam kodów pocztowych), więc co odpowiedź muszę doklejać do słownika więc mam jednak tak:

import urllib.request
import json
import ssl

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
serviceurl = 'https://nominatim.openstreetmap.org/search.php?'
lista_kodow_odpowiedzi={}

lista_kodow = ('00-001', '00-002', '00-003')
for kod_pocztowy in lista_kodow:
    parms = dict()
    parms['q'] = kod_pocztowy
    parms['format'] = 'geojson'
    parms['limit'] = 1
    url = serviceurl + urllib.parse.urlencode(parms)
    print('Pobieranie', url)
    uh = urllib.request.urlopen(url, context=ctx)
    data = uh.read().decode()
    js = json.loads(data)
    lng = js['features'][0]['geometry']['coordinates'][0]
    lat = js['features'][0]['geometry']['coordinates'][1]
    nazwa_miejsca = js['features'][0]['properties']['display_name']
    lista_kodow_odpowiedzi[kod_pocztowy]=[lng, lat, nazwa_miejsca]
print(lista_kodow_odpowiedzi)

Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1