迭代 JSON 数据并打印。 (或从 JSON 文件创建 Pandas DataFrame)

Iterating over JSON data and printing. (or creating Pandas DataFrame from JSON file)

我正在尝试使用 Python 从我从 API 中提取的 JSON 文件打印特定值。据我所知,我将其提取为一个 JSON 文件,其中包含玩家词典列表,每个玩家都有一个包含他们数据(即姓名、团队等)的嵌套词典。

我 运行 遇到打印 JSON 文件中的值的问题,因为每个字符都在单独的行上打印。

我试图得到的最终结果是一个 Pandas DataFrame,其中包含 JSON 文件中的所有值,但我什至无法遍历 JSON 文件正确。

这是我的代码:

url = "https://api-football-v1.p.rapidapi.com/v3/players"

querystring = {"league":"39","season":"2020", "page":"2"}

headers = {
        "X-RapidAPI-Host": "api-football-v1.p.rapidapi.com",
        "X-RapidAPI-Key": "xxxxxkeyxxxxx"
}

response = requests.request("GET", url, headers=headers, params=querystring).json()

response_dump = json.dumps(response)

for item in response_dump:
    for player_item in item:
        print(player_item)

这是我打印 JSON 响应(前两项)时的输出:

{'get': 'players', 'parameters': {'league': '39', 'page': '2', 'season': '2020'}, 'errors': [], 'results': 20, 'paging': {'current': 2, 'total': 37}, 'response': [{'player': {'id': 301, 'name': 'Benjamin Luke Woodburn', 'firstname': 'Benjamin Luke', 'lastname': 'Woodburn', 'age': 23, 'birth': {'date': '1999-10-15', 'place': 'Nottingham', 'country': 'England'}, 'nationality': 'Wales', 'height': '174 cm', 'weight': '72 kg', 'injured': False, 'photo': 'https://media.api-sports.io/football/players/301.png'}, 'statistics': [{'team': {'id': 40, 'name': 'Liverpool', 'logo': 'https://media.api-sports.io/football/teams/40.png'}, 'league': {'id': 39, 'name': 'Premier League', 'country': 'England', 'logo': 'https://media.api-sports.io/football/leagues/39.png', 'flag': 'https://media.api-sports.io/flags/gb.svg', 'season': 2020}, 'games': {'appearences': 0, 'lineups': 0, 'minutes': 0, 'number': None, 'position': 'Attacker', 'rating': None, 'captain': False}, 'substitutes': {'in': 0, 'out': 0, 'bench': 3}, 'shots': {'total': None, 'on': None}, 'goals': {'total': 0, 'conceded': 0, 'assists': None, 'saves': None}, 'passes': {'total': None, 'key': None, 'accuracy': None}, 'tackles': {'total': None, 'blocks': None, 'interceptions': None}, 'duels': {'total': None, 'won': None}, 'dribbles': {'attempts': None, 'success': None, 'past': None}, 'fouls': {'drawn': None, 'committed': None}, 'cards': {'yellow': 0, 'yellowred': 0, 'red': 0}, 'penalty': {'won': None, 'commited': None, 'scored': 0, 'missed': 0, 'saved': None}}]}, {'player': {'id': 518, 'name': 'Meritan Shabani', 'firstname': 'Meritan', 'lastname': 'Shabani', 'age': 23, 'birth': {'date': '1999-03-15', 'place': 'München', 'country': 'Germany'}, 'nationality': 'Germany', 'height': '185 cm', 'weight': '78 kg', 'injured': False, 'photo': 'https://media.api-sports.io/football/players/518.png'}, 'statistics': [{'team': {'id': 39, 'name': 'Wolves', 'logo': 'https://media.api-sports.io/football/teams/39.png'}, 'league': {'id': 39, 'name': 'Premier League', 'country': 'England', 'logo': 'https://media.api-sports.io/football/leagues/39.png', 'flag': 'https://media.api-sports.io/flags/gb.svg', 'season': 2020}, 'games': {'appearences': 0, 'lineups': 0, 'minutes': 0, 'number': None, 'position': 'Midfielder', 'rating': None, 'captain': False}, 'substitutes': {'in': 0, 'out': 0, 'bench': 3}, 'shots': {'total': None, 'on': None}, 'goals': {'total': 0, 'conceded': 0, 'assists': None, 'saves': None}, 'passes': {'total': None, 'key': None, 'accuracy': None}, 'tackles': {'total': None, 'blocks': None, 'interceptions': None}, 'duels': {'total': None, 'won': None}, 'dribbles': {'attempts': None, 'success': None, 'past': None}, 'fouls': {'drawn': None, 'committed': None}, 'cards': {'yellow': 0, 'yellowred': 0, 'red': 0}, 'penalty': {'won': None, 'commited': None, 'scored': 0, 'missed': 0, 'saved': None}}]},

这是 JSON 文件每一层的数据类型,从我用 For 循环遍历它开始:

打印(类型(响应))<class 'dict'>

打印(类型(response_dump))<class 'str'>

打印(类型(项目))<class 'str'>

打印(类型(player_item))<class 'str'>

我认为你不必 json.dumps(),只需使用 response 中的 JSON 进行迭代:

for player in response['response']:
    print(player)

{'player': {'id': 301, 'name': 'Benjamin Luke Woodburn', 'firstname': 'Benjamin Luke', 'lastname': 'Woodburn', 'age': 23, 'birth': {'date': '1999-10-15', 'place': 'Nottingham', 'country': 'England'}, 'nationality': 'Wales', 'height': '174 cm', 'weight': '72 kg', 'injured': False, 'photo': 'https://media.api-sports.io/football/players/301.png'}, 'statistics': [{'team': {'id': 40, 'name': 'Liverpool', 'logo': 'https://media.api-sports.io/football/teams/40.png'}, 'league': {'id': 39, 'name': 'Premier League', 'country': 'England', 'logo': 'https://media.api-sports.io/football/leagues/39.png', 'flag': 'https://media.api-sports.io/flags/gb.svg', 'season': 2020}, 'games': {'appearences': 0, 'lineups': 0, 'minutes': 0, 'number': None, 'position': 'Attacker', 'rating': None, 'captain': False}, 'substitutes': {'in': 0, 'out': 0, 'bench': 3}, 'shots': {'total': None, 'on': None}, 'goals': {'total': 0, 'conceded': 0, 'assists': None, 'saves': None}, 'passes': {'total': None, 'key': None, 'accuracy': None}, 'tackles': {'total': None, 'blocks': None, 'interceptions': None}, 'duels': {'total': None, 'won': None}, 'dribbles': {'attempts': None, 'success': None, 'past': None}, 'fouls': {'drawn': None, 'committed': None}, 'cards': {'yellow': 0, 'yellowred': 0, 'red': 0}, 'penalty': {'won': None, 'commited': None, 'scored': 0, 'missed': 0, 'saved': None}}]}
{'player': {'id': 518, 'name': 'Meritan Shabani', 'firstname': 'Meritan', 'lastname': 'Shabani', 'age': 23, 'birth': {'date': '1999-03-15', 'place': 'München', 'country': 'Germany'}, 'nationality': 'Germany', 'height': '185 cm', 'weight': '78 kg', 'injured': False, 'photo': 'https://media.api-sports.io/football/players/518.png'}, 'statistics': [{'team': {'id': 39, 'name': 'Wolves', 'logo': 'https://media.api-sports.io/football/teams/39.png'}, 'league': {'id': 39, 'name': 'Premier League', 'country': 'England', 'logo': 'https://media.api-sports.io/football/leagues/39.png', 'flag': 'https://media.api-sports.io/flags/gb.svg', 'season': 2020}, 'games': {'appearences': 0, 'lineups': 0, 'minutes': 0, 'number': None, 'position': 'Midfielder', 'rating': None, 'captain': False}, 'substitutes': {'in': 0, 'out': 0, 'bench': 3}, 'shots': {'total': None, 'on': None}, 'goals': {'total': 0, 'conceded': 0, 'assists': None, 'saves': None}, 'passes': {'total': None, 'key': None, 'accuracy': None}, 'tackles': {'total': None, 'blocks': None, 'interceptions': None}, 'duels': {'total': None, 'won': None}, 'dribbles': {'attempts': None, 'success': None, 'past': None}, 'fouls': {'drawn': None, 'committed': None}, 'cards': {'yellow': 0, 'yellowred': 0, 'red': 0}, 'penalty': {'won': None, 'commited': None, 'scored': 0, 'missed': 0, 'saved': None}}]}

for player in response['response']:
    print(player['player'])

{'id': 301, 'name': 'Benjamin Luke Woodburn', 'firstname': 'Benjamin Luke', 'lastname': 'Woodburn', 'age': 23, 'birth': {'date': '1999-10-15', 'place': 'Nottingham', 'country': 'England'}, 'nationality': 'Wales', 'height': '174 cm', 'weight': '72 kg', 'injured': False, 'photo': 'https://media.api-sports.io/football/players/301.png'}
{'id': 518, 'name': 'Meritan Shabani', 'firstname': 'Meritan', 'lastname': 'Shabani', 'age': 23, 'birth': {'date': '1999-03-15', 'place': 'München', 'country': 'Germany'}, 'nationality': 'Germany', 'height': '185 cm', 'weight': '78 kg', 'injured': False, 'photo': 'https://media.api-sports.io/football/players/518.png'}

要获得 DataFrame 只需调用 pd.json_normalize() - 因为您的问题不是很清楚 我不确定是否需要信息以及如何显示。这注定要提出一个具有确切焦点的新问题。:

pd.json_normalize(response['response'])

编辑

根据您的评论和改进:

pd.concat([pd.json_normalize(response,['response'])\
          ,pd.json_normalize(response,['response','statistics'])], axis=1)\
  .drop(['statistics'], axis=1)
player.id player.name player.firstname player.lastname player.age player.birth.date player.birth.place player.birth.country player.nationality player.height player.weight player.injured player.photo team.id team.name team.logo league.id league.name league.country league.logo league.flag league.season games.appearences games.lineups games.minutes games.number games.position games.rating games.captain substitutes.in substitutes.out substitutes.bench shots.total shots.on goals.total goals.conceded goals.assists goals.saves passes.total passes.key passes.accuracy tackles.total tackles.blocks tackles.interceptions duels.total duels.won dribbles.attempts dribbles.success dribbles.past fouls.drawn fouls.committed cards.yellow cards.yellowred cards.red penalty.won penalty.commited penalty.scored penalty.missed penalty.saved
0 301 Benjamin Luke Woodburn Benjamin Luke Woodburn 23 1999-10-15 Nottingham England Wales 174 cm 72 kg False https://media.api-sports.io/football/players/301.png 40 Liverpool https://media.api-sports.io/football/teams/40.png 39 Premier League England https://media.api-sports.io/football/leagues/39.png https://media.api-sports.io/flags/gb.svg 2020 0 0 0 Attacker False 0 0 3 0 0 0 0 0 0 0
1 518 Meritan Shabani Meritan Shabani 23 1999-03-15 München Germany Germany 185 cm 78 kg False https://media.api-sports.io/football/players/518.png 39 Wolves https://media.api-sports.io/football/teams/39.png 39 Premier League England https://media.api-sports.io/football/leagues/39.png https://media.api-sports.io/flags/gb.svg 2020 0 0 0 Midfielder False 0 0 3 0 0 0 0 0 0 0