Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/47: Рейтинг темы: голосов - 47, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 03.12.2015
Сообщений: 126
1

Парсинг json файла

22.06.2019, 21:56. Показов 8623. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, столкнулся с такой проблемой и не могу решить. Пытаюсь парсить json файл, и получить из него только нужные мне строки, а точнее значения ключей. Должны выводиться имена игроков, а выводятся их ID, как указать правильный путь?

Функция дает следующий путь на нужные мне значения

Python
1
['sportItem']['tournaments'][1]['events'][11]['homeTeam']['name'] => Medvedev D.
Мне нужно тут получить имя игрока: Medvedev D., но почему то выводятся ID этого игрока

Python
1
['sportItem']['tournaments'][1]['events'][11]['homeTeam']['id'] => 163504
Помогите пожалуйста с кодом, как исправить? Не подходит метод поиска по конкретной строке типо так ['sportItem']['tournaments'][1]['events'][11]['homeTeam']['id'], значения в скобках где находится например цифра 11, меняются постоянно

Вот код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import json
 
# получаем все ключи json 
def flatten2(obj):
    out = []
    def flatten(obj,keys='[',delim='][',):
        if type(obj) is dict and obj:
            for key in obj:
                flatten(obj[key], keys + repr(key) + delim)
        elif type(obj) is list or type(obj) is tuple:
            for  i,item in enumerate(obj):
                flatten(item, keys + repr(i) + delim)
        else:
            out.append([keys[:-1],obj])
    flatten(obj)
    return out
 
# загружаем json файл 
with open('js.json', 'r', encoding='utf-8') as fh: #открываем файл на чтение
    d = json.load(fh) #загружаем из файла данные в словарь data
 
# отправляем данные из json файла в функицю для получения ключей
f = flatten2(d)
 
# выводим нужное нам
for k,v in f:
    if 'homeTeam' in k and 'name' in k:
        player_1 = v
    elif 'awayTeam' in k and 'name' in k:
        player_2 = v
    elif 'homeScore' in k and 'period1' in k:
        shet_1 = v
    elif 'awayScore' in k and 'period1' in k:
        shet_2 = v            
 
        print(player_1, shet_1)
        print(player_2, shet_2)
        print('\n')

Вот ссылка на файл с данными json : https://drive.google.com/open?... RuIAh_UhWN
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2019, 21:56
Ответы с готовыми решениями:

Парсинг json
Добрый день, подскажите как распарсить json, чтобы получить значения email address,и почту т.е....

Парсинг json
Доброго времени суток, господа. При парсинге страницы нужные данные кодируются в вид:...

Python 2.7 парсинг JSON
В ответ на зарпрос получаю джейсон примерно такой структуры {u'count': 9306, u'offers': ,...

Python парсинг JSON
Парсю файлик networks = json.load(open("json/networks.json")) for item in networks: ...

4
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
22.06.2019, 23:24 2
Лучший ответ Сообщение было отмечено soberfrog как решение

Решение

И зачем мучиться, когда есть готовые библиотеки...
Парсинг json файла
1
1 / 1 / 0
Регистрация: 03.12.2015
Сообщений: 126
23.06.2019, 00:19  [ТС] 3
Огромное Вам спасибо, Вы даже более чем помогли )))

Добавлено через 10 минут
В матчах там играет два игрока, то есть играют друг против друга, как можно парсить по двум условиям? Тут получается в for перебираются только первые игроки матчей, а еще нужны вторые. У меня в коде прописано, они обозначаются как awayTeam, они должны выводиться парами по два
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
23.06.2019, 02:00 4
Цитата Сообщение от soberfrog Посмотреть сообщение
они должны выводиться парами по два
Да не вопрос.
Парсим сразу два поля и "хитрым" способом объединяем их в пары:
Python
1
2
3
4
# все чуваки
it = parse('$[*].sportItem.tournaments.[*].events.[*].[homeTeam,awayTeam].name').find(d)
for homeTeam,awayTeam in zip(*[iter(it)]*2):
    print(homeTeam.value,'<=>',awayTeam.value)
Код
Gasquet R. <=> Bautista Agut R.
Johnson S. <=> Zverev A.
Federer R. <=> Tsonga J.
Berrettini M. <=> Khachanov K.
Goffin D. <=> Zverev A.
Ćorić B. <=> Herbert P.
Federer R. <=> Bautista Agut R.
Berrettini M. <=> Goffin D.
Federer R. <=> Herbert P.
Wawrinka S. <=> Mahut N.
Dimitrov G. <=> Auger-Aliassime F.
Pouille L. <=> Medvedev D.
Bedene A. <=> Raonic M.
Tsitsipas S. <=> Chardy J.
Kyrgios N. <=> Auger-Aliassime F.
Schwartzman D. <=> Medvedev D.
del Potro J. <=> López F.
Mahut N. <=> Simon G.
Tsitsipas S. <=> Auger-Aliassime F.
López F. <=> Raonic M.
Medvedev D. <=> Simon G.
P.S. Но в json же эти пары вроде и так уже есть: в поле events[любой_индекс].name

Python
1
2
3
it = parse('$[*].sportItem.tournaments.[*].events.[*].name').find(d)
for m in it:
    print(m.value)

Код
Gasquet R. - Bautista Agut R.
Johnson S. - Zverev A.
Federer R. - Tsonga J.
Berrettini M. - Khachanov K.
Goffin D. - Zverev A.
Ćorić B. - Herbert P.
Federer R. - Bautista Agut R.
Berrettini M. - Goffin D.
Federer R. - Herbert P.
Wawrinka S. - Mahut N.
Dimitrov G. - Auger-Aliassime F.
Pouille L. - Medvedev D.
Bedene A. - Raonic M.
Tsitsipas S. - Chardy J.
Kyrgios N. - Auger-Aliassime F.
Schwartzman D. - Medvedev D.
del Potro J. - López F.
Mahut N. - Simon G.
Tsitsipas S. - Auger-Aliassime F.
López F. - Raonic M.
Medvedev D. - Simon G.
0
Эксперт Python
5434 / 3857 / 1215
Регистрация: 28.10.2013
Сообщений: 9,553
Записей в блоге: 1
23.06.2019, 18:28 5
soberfrog,
Тот вариант, который был дан мною в личке работал неверно, так как у некоторых игроков отсутствовали поля homeScore и awayScore и поэтому итератор перескакивал на следующего игрока, последовательность данных сбивалась и конечный вывод был неправильным.
Поэтому пришлось усложнить код.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
d = json.load(open("play.json"))
events = parse('$[*].sportItem.tournaments[*].events[*].[homeTeam,awayTeam,homeScore,awayScore]').find(d)
data = []
iters = [iter(events)] * 4
for homeTeam,awayTeam,homeScore,awayScore in zip(*iters):
    subdata = []
    subdata.append(parse('name').find(homeTeam.value))
    subdata.append(parse('period1').find(homeScore.value))
    subdata.append(parse('name').find(awayTeam.value))
    subdata.append(parse('period1').find(awayScore.value))
    for i in range(len(subdata)):
        # если список пуст - значит какого-то поля у игрока не было и мы возвращаем вместо него значение по умолчанию - например, пустую строку.
        subdata[i] = subdata[i][0].value if subdata[i] else ""  
    data.append(tuple(subdata))
Код
[('Gasquet R.', 1, 'Bautista Agut R.', 6),
 ('Johnson S.', 3, 'Zverev A.', 6),
 ('Federer R.', 7, 'Tsonga J.', 6),
 ('Berrettini M.', 6, 'Khachanov K.', 2),
 ('Goffin D.', 3, 'Zverev A.', 6),
 ('Ćorić B.', 5, 'Herbert P.', 7),
 ('Federer R.', 6, 'Bautista Agut R.', 3),
 ('Berrettini M.', 6, 'Goffin D.', 7),
 ('Federer R.', 6, 'Herbert P.', 3),
 ('Wawrinka S.', 6, 'Mahut N.', 3),
 ('Dimitrov G.', 4, 'Auger-Aliassime F.', 6),
 ('Pouille L.', 6, 'Medvedev D.', 7),
 ('Bedene A.', 3, 'Raonic M.', 6),
 ('Tsitsipas S.', 4, 'Chardy J.', 6),
 ('Kyrgios N.', 7, 'Auger-Aliassime F.', 6),
 ('Schwartzman D.', 2, 'Medvedev D.', 6),
 ('del Potro J.', '', 'López F.', ''),
 ('Mahut N.', 6, 'Simon G.', 7),
 ('Tsitsipas S.', 5, 'Auger-Aliassime F.', 7),
 ('López F.', 4, 'Raonic M.', 6),
 ('Medvedev D.', 7, 'Simon G.', 6)]
0
23.06.2019, 18:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.06.2019, 18:28
Помогаю со студенческими работами здесь

Парсинг json страницы
Доброй ночи. Есть json страница. Как её прочитать не скачивая и вывести оттуда значение ключа...

Мой парсинг html в json
Здравствуйте, я молодая кровь бэк-энда)) передомной стояла задача из HTML файла спарсить данные в...

Парсинг JSON с использованием requests
Написать парсер данных, размещенных в json-формате с применением библиотеки requests ссылка:...

Парсинг JSON
Помогите спарсить url mp3 из json зайцев.нет...

Парсинг json
{'kind': 'youtube#videoListResponse', 'etag': 'a8y-ABn8h6bd0bI9hK2pxzOyJQE', 'items': , 'pageInfo':...

Автоматический парсинг в JSON
Итак, я заново написал код. import json import codecs import re import time from urllib.parse...

Парсинг произвольного json
Мне нужно из произвольного json'а найти все поля со строковыми значениями. Есть ли на питоне...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru