内容提要
本文介绍如何用 Python 和 Open-Meteo 免费 API 构建命令行天气应用:先通过地理编码 API 将城市名转换为经纬度,再请求当前温度和风速,使用 requests 解析 JSON,并用 sys 处理命令行参数、优雅处理错误。作者建议先实现基础版本,再逐步添加湿度、预报等功能,并强调亲手重写代码才能真正掌握 API 调用。
延伸解读
地理编码:城市名转经纬度的关键步骤
文章使用 Open-Meteo 的免费地理编码 API 将城市名转换为经纬度,这是调用天气 API 的前提。代码中通过 count=1 只取第一个匹配结果,作者提醒同名城市可能有多处,因此结果未必是用户期望的地点。读者在实际使用时应留意这一局限,或后续增加多结果选择功能。
错误处理:让命令行工具更健壮
示例代码对网络请求异常和 JSON 解析错误分别做了捕获,并在地理编码无结果时返回 None,避免程序崩溃。这种分层处理让工具在断网或输入错误城市时仍能给出友好提示。读者可借鉴这种模式,在调用其他 API 时也加入超时和异常捕获,提升脚本的可靠性。
从基础版到功能扩展的渐进路径
作者建议先实现当前温度和风速的基础版本,再逐步添加湿度、短期预报、多城市选择等功能。每次只做一个小改进,避免一次性堆砌功能导致混乱。这种迭代方式适合初学者巩固 API 调用、字典操作和错误处理等核心技能,也便于定位问题。
亲手重写:真正掌握 API 调用的关键
文章强调,看懂代码不等于掌握,建议读者在理解示例后关闭页面,从零重写整个应用。过程中难免遗忘或遇到报错,但正是排查和修复的过程能加深对 HTTP 请求、JSON 解析和命令行参数的理解。掌握这一模式后,可尝试用同样的思路对接其他类型的 API。
Q&A
如何用 Python 将城市名转换为经纬度?
使用 Open-Meteo 的免费地理编码 API。发送 GET 请求到 https://geocoding-api.open-meteo.com/v1/search,参数包括 name(城市名)和 count=1,然后从返回的 JSON 中提取 results[0] 的 latitude 和 longitude。如果无结果则返回 None。
怎样用 Python 获取指定经纬度的当前天气数据?
向 Open-Meteo 的天气 API 发送请求:https://api.open-meteo.com/v1/forecast,参数包括 latitude、longitude 和 current=temperature_2m,wind_speed_10m。解析 JSON 后返回 data['current'] 即可得到当前温度和风速。
如何让 Python 脚本从命令行接收城市名参数?
使用 sys 模块。sys.argv 列表包含命令行参数,sys.argv[0] 是脚本名,sys.argv[1:] 是传入的参数。可以用 ' '.join(sys.argv[1:]) 来支持带空格的城市名(如 New York)。
在天气应用中如何优雅地处理网络请求错误?
使用 try-except 捕获 requests.exceptions.RequestException 来处理网络连接问题,并捕获 KeyError 和 ValueError 来处理数据解析错误。同时,在请求中设置 timeout 参数(如 timeout=5)避免长时间等待。
构建这个命令行天气应用需要安装哪些库?
只需要安装 requests 库,用于发送 HTTP 请求。可以通过 pip install requests 安装。其他如 sys 是 Python 标准库,无需额外安装。
这个天气应用可以进一步添加哪些功能?
可以添加湿度(使用 relative_humidity_2m 参数)、显示短期预报、让用户从多个匹配城市中选择、以及美化输出格式。建议每次只添加一个小功能,逐步完善。
为什么作者建议在完成基础版本后要自己从头重写代码?
因为复制粘贴代码无法真正掌握知识,自己重写时会遇到错误并需要调试,这个过程能加深理解,真正学会 API 调用和错误处理。