вернуть данные из файла json, если другой файл не существует - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь вернуть данные в Django модель, из Overpass API JSON данные после загрузки

"elements": [
{
  "type": "node",
  "id": 662934404,
  "lat": 35.572157,
  "lon": 45.3898839,
  "tags": {
    "addr:postcode": "46001",
    "name": "City Center",
    "name:en": "City Center Mall",
    "name:ku": "City Center Mall",
    "shop": "mall",
    "website": "http://www.citycentersul.com"
  }
},
{
  "type": "node",
  "id": 2413990402,
  "lat": 35.5014386,
  "lon": 45.4457576,
  "tags": {
    "addr:city": "sulaymaniyah",
    "designation": "ASSAN",
    "name": "ASSAN STEEL CO.",
    "opening_hours": "3 min",
    "shop": "doityourself",
    "source": "ASSAN Steel Company General  Trading  Co, Ltd"
  },
{
  "type": "node",
  "id": 2414374708,
  "lat": 35.506121,
  "lon": 45.4417229,
  "tags": {
    "addr:city": "sulaymaniyah",
    "name:ku": "ASSAN Steel Company General Trading Co, Ltd",
    "shop": "doityourself",
  }
},

, но некоторые данные не имеют обоих вместе name , name:ku ,name:en, так что Должен ли я сделать, если name нет, то вернуть имя: ku, если оно существует, тогда name: en

Я пробовал это, но не работает

with open('data.json') as datafile:
    objects = json.load(datafile)
    for obj in objects['elements']:
        try:
            objType = obj['type']
            if objType == 'node':
                tags = obj['tags']
                name = tags.get('name')
                if not name:
                    name = tags.get('name:en')
                elif not name:
                    name = tags.get('name:ku')
                elif not name:
                    name = tags.get('name:ar')
                else:
                    name = tags.get('shop','no-name')

Есть ли что-то еще, что я пропущенный? спасибо за помощь

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Следующие и все последующие elif -условия неверны:

name = tags.get('name')
if not name:
    name = tags.get('name:en')
elif not name:
    name = tags.get('name:ku')

elif применяется ко всем предыдущим условиям и выполняется только в том случае, если все предыдущие условия оцениваются как false. В вашем случае, однако, первое условие if (if not name) уже оценивается как true. Поэтому ваши elif -условия не будут выполнены. Вместо этого вам нужно изменить их на if -условия:

name = tags.get('name')
if not name:
    name = tags.get('name:en')
if not name:
    name = tags.get('name:ku')
if not name:
    name = tags.get('name:ar')
if not name:
    name = tags.get('shop','no-name')

Подход loop, предложенный Морисом в { ссылка }, лучше, хотя.

1 голос
/ 23 марта 2020

Вы можете l oop по всем возможным клавишам и остановиться после обнаружения значения:

with open('data.json') as datafile:
objects = json.load(datafile)
for obj in objects['elements']:
    objType = obj['type']
    if objType == 'node':
        tags = obj['tags']

        name = None
        for nameId in ('name', 'name:en', 'name:ku', 'name:ar'):
            if nameId in tags:
                name = tags[name]
                break # stop looping, we got a name value

        # Set default if no key was found
        if not name:
            name = tags.get('shop','no-name')
...