0

0

Python API数据提取教程:理解循环与字典创建的缩进陷阱

DDD

DDD

发布时间:2025-11-30 13:36:22

|

734人浏览过

|

来源于php中文网

原创

python api数据提取教程:理解循环与字典创建的缩进陷阱

本文深入探讨了在Python中从嵌套API响应中提取数据时,因循环缩进不当导致字典追加不完整的问题。通过一个具体的PGA高尔夫赛事数据抓取案例,详细分析了错误原因,并提供了正确的代码结构和解决方案。教程强调了Python中缩进的重要性,指导读者如何确保在多层嵌套循环中正确构建并累加所有目标数据记录,最终生成完整的DataFrame。

在处理来自外部API的复杂JSON数据时,开发者经常需要遍历多层嵌套结构来提取所需信息。然而,不正确的代码缩进是导致数据丢失或不完整的一个常见陷阱。本教程将通过一个实际案例,详细剖析这一问题及其解决方案。

API数据提取与不完整的记录:问题场景

假设我们需要从ESPN的PGA高尔夫赛事API中获取所有参赛选手的信息。API返回的JSON数据结构通常是多层嵌套的,例如:events -> competitions -> competitors -> athlete。我们的目标是从中提取每个赛事(event)的ID、日期、名称以及所有参赛选手(playerName)。

初次尝试的代码可能如下所示,旨在遍历赛事和选手并收集数据:

立即学习Python免费学习笔记(深入)”;

import requests
import pandas as pd

# 定义API端点
api = 'https://site.web.api.espn.com/apis/site/v2/sports/golf/leaderboard?league=pga'

# 发送GET请求并获取JSON响应
response = requests.get(api)
data = response.json()

# 提取事件数据
events = data['events']

# 创建一个空列表来存储游戏数据
games = []

# 遍历每个事件并获取相关信息
for event in events:
    game_id = event['id']
    date = event['date']
    name = event['name']

    for competition in event['competitions']:
        for competitor in competition['competitors']:
            athlete = competitor['athlete']
            playerName = athlete['displayName'] # 每次循环都会更新playerName变量

    # 在循环外部创建字典并追加,此时playerName已是最后一个competitor的值
    game = {
        'game_id': game_id,
        'date': date,
        'name': name,
        'playerName': playerName
    }
    games.append(game)

# 转换为pandas DataFrame
df = pd.DataFrame(games)
print(df)

运行上述代码,我们可能会得到类似以下的结果:

     game_id               date        name playerName
0  401580329  2024-01-04T05:00Z  The Sentry  Sam Burns

从结果中可以看出,尽管API响应中包含多名选手,但最终的DataFrame中却只显示了最后一位选手的记录(例如 "Sam Burns"),并且每场赛事只有一条记录,这显然不是我们期望的。

造梦阁AI
造梦阁AI

AI小说推文一键成片,你的故事值得被看见

下载

问题分析:Python缩进与变量作用域的影响

出现上述问题的原因在于Python的缩进规则和变量作用域。在原始代码中:

  1. 最内层的 for competitor in competition['competitors']: 循环确实遍历了所有的 competitor,并且每次迭代都正确地更新了 playerName 变量。
  2. 然而,game 字典的创建和 games.append(game) 操作却被放置在 for competitor 循环的 外部
  3. 这意味着,对于每个 event,当 for competitor 循环结束后,playerName 变量将保留其在 最后一次 迭代中的值。
  4. 随后,game 字典只会被创建 一次,并使用这个最终的 playerName 值,然后被追加到 games 列表中。

因此,对于每个赛事,无论有多少参赛者,我们最终只会得到一条记录,其中包含该赛事下最后一个参赛者的信息。

解决方案:调整字典创建和追加的缩进

要解决这个问题,我们需要确保在每次遍历到新的 competitor 时,都创建一个新的 game 字典并将其追加到 games 列表中。这需要将 game 字典的创建和 games.append(game) 操作移动到 for competitor 循环的 内部,使其成为该循环的一部分。

以下是修正后的代码:

import requests
import pandas as pd

# 定义API端点
api = 'https://site.web.api.espn.com/apis/site/v2/sports/golf/leaderboard?league=pga'

# 发送GET请求并获取JSON响应
response = requests.get(api)
data = response.json()

# 提取事件数据
events = data['events']

# 创建一个空列表来存储游戏数据
games = []

# 遍历每个事件并获取相关信息
for event in events:
    game_id = event['id']
    date = event['date']
    name = event['name']

    for competition in event['competitions']:
        for competitor in competition['competitors']:
            athlete = competitor['athlete']
            playerName = athlete['displayName']

            # 关键修改:将字典创建和追加操作移到最内层循环内部
            game = {
                'game_id': game_id,
                'date': date,
                'name': name,
                'playerName': playerName
            }
            games.append(game) # 每次循环一个competitor,就创建一个字典并追加

# 转换为pandas DataFrame
df = pd.DataFrame(games)
print(df)

通过这次修改,每当代码遍历到一个新的 competitor 时,它都会立即创建一个包含当前 game_id、date、name 和 playerName 的字典,并将其添加到 games 列表中。这样,所有参赛者的信息都将被正确捕获和存储。

关键点与注意事项

  1. Python的缩进规则: Python使用缩进来定义代码块(如循环体、函数体、条件语句等)。理解这一点对于避免逻辑错误至关重要。错误的缩进不会导致语法错误,但会导致程序逻辑与预期不符。
  2. 嵌套循环中的数据累积: 当处理多层嵌套数据结构时,务必清楚在哪个循环层级创建和累积数据。如果需要为内层循环的每个元素生成一条记录,那么字典的创建和列表的追加操作就必须发生在最内层循环内部。
  3. 变量作用域: 变量的生命周期和作用域由其定义位置和缩进决定。在循环外部定义的变量在整个循环过程中保持不变,而在循环内部定义的变量则会在每次迭代时重新创建或更新。
  4. 调试技巧:
    • 使用 print() 语句: 在循环内部的关键位置打印变量的值,可以帮助你追踪数据流和变量状态。例如,在 playerName = athlete['displayName'] 之后立即 print(playerName),可以确认每个 competitor 的名字是否被正确获取。
    • 逐步调试器: 使用IDE(如VS Code、PyCharm)提供的调试器,可以逐行执行代码,观察变量的变化,从而更直观地发现问题。
    • 检查API响应结构: 在开始编码前,仔细检查API返回的JSON结构,明确数据路径,有助于规划循环和数据提取逻辑。

总结

在Python中处理API响应并提取嵌套数据时,正确理解和运用缩进是避免数据丢失的关键。本教程通过一个具体的案例,强调了将字典创建和列表追加操作放置在正确循环层级的重要性。掌握这些基本原则,将有助于你更高效、准确地处理复杂数据,构建健壮的数据处理流程。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

769

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

659

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1325

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 10.3万人学习

Django 教程
Django 教程

共28课时 | 3.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号