🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【复制粘贴即可运行】用Python和API制作天气预报CLI应用!给初学者的保姆级分步教程

“我开始学编程了,但不知道该做什么…” “我正在学习,但因为做不出能实际运行的东西,感觉快要放弃了…”

就在几个月前,我也抱着完全相同的烦恼。我从编程知识为零开始,借助AI的力量自学,现在已经能运营网站了。但在学习初期,我感到最重要的事情就是“亲手创造并运行一些东西的体验”

在本文中,我将比任何地方都更详细地解释如何使用Python制作一个能告诉你天气预报的简单命令行(CLI)应用程序,以便编程初学者能够体验到“它动了!真好玩!”的感觉。

完成后的效果是这样的。在终端(黑色屏幕)中输入命令后……?

$ python weather.py 东京

[ 东京 (JP) 的天气 ]
天气: 晴 ☀️
气温: 28.5℃ (体感温度: 29.1℃)
湿度: 65%
风速: 3.1 m/s

一点都不难!只需复制粘贴,它就能立刻在你的电脑上运行。我也会坦誠地分享我实际遇到的问题,所以请放心地跟着我做。

第 1 步:准备开始冒险! - 获取天气API密钥

首先,我们从哪里获取天气信息呢?我们在电视或智能手机上看到的天气预报,其数据来源也是气象局等专业机构观测得来的,对吧?

这次,我们将使用一个名为OpenWeatherMap的服务。利用该服务提供的API机制,我们就可以在程序中自由获取世界各地的天气数据。

不必把“API是什么?”想得太复杂。现在,你只需把它看作是“从程序获取天气数据的暗号(密钥)”之类的东西。下面我来解释获取这个密钥(API Key)的步骤。

  1. 访问OpenWeatherMap的API页面,点击“Current Weather Data”下的“Subscribe”按钮。
  2. 在免费计划中点击“Get API key”按钮,然后创建一个账户(设置你的邮箱地址和密码等)。
  3. 注册完成后,你的专用API密钥就会出现在仪表盘的“API keys”标签页中。这个由大约32位字母和数字组成的字符串就是我前面提到的“暗号”。

【非常重要】绝对不要将你的API密钥告诉他人,或在社交网络、GitHub等地方公开!
这个密钥是你专用的。如果被怀有恶意的人知道,他们可能会进行大量的恶意访问,导致你被收取费用。请像保管自家钥匙一样,严格管理它。


第 2 步:准备必要的工具! - `requests`库

拿到API密钥后,下一步是准备一个能让Python使用API的工具。这个工具就是`requests`库。

库就像一个预装了各种便利功能的“工具箱”。使用`requests`,只需几行代码就能访问网站和API。

请打开你电脑的终端(Windows上是命令提示符或PowerShell,Mac上是终端),然后运行以下命令。

pip install requests

如果看到`Successfully installed...`之类的消息,就表示成功了。现在,与天气API通信的准备工作已经完成!

第 3 步:先来个简单的尝试!

终于到了编码的时候了。首先,我们来写一段非常非常简单的代码,获取特定城市(这里是东京)的天气。请在你的编辑器中创建一个名为`weather.py`的文件,然后粘贴以下代码。

import requests
import json

# 请替换为在第1步中获取的你的API密钥
API_KEY = "在此处粘贴你的API密钥"
CITY_NAME = "Tokyo"

# 构建API请求URL
api_url = f"https://api.openweathermap.org/data/2.5/weather?q={CITY_NAME}&appid={API_KEY}&units=metric&lang=zh_cn"

try:
    # 实际向API发送请求
    response = requests.get(api_url)
    response.raise_for_status() # 如果有错误,则抛出异常

    # 将结果从JSON格式转换为Python的字典类型
    data = response.json()

    # 以易于阅读的方式显示数据
    print(json.dumps(data, indent=2, ensure_ascii=False))

except requests.exceptions.RequestException as e:
    print(f"发生了通信错误: {e}")
except Exception as e:
    print(f"发生了意外错误: {e}")

粘贴代码后,别忘了将`API_KEY = "在此处粘贴你的API密钥"`这部分替换成你刚刚获取的自己的API密钥哦。

替换完成后,让我们在终端中运行这个文件吧。

$ python weather.py

怎么样?如果显示了下面这样大量的文字(数据),就表示成功了!

{
  "coord": {
    "lon": 139.6917,
    "lat": 35.6895
  },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "晴",
      "icon": "01d"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 28.5,
    "feels_like": 29.1,
    "temp_min": 27.21,
    "temp_max": 29.58,
    "pressure": 1012,
    "humidity": 65
  },
  "visibility": 10000,
  "wind": {
    "speed": 3.09,
    "deg": 190
  },
  // ...后面还有很多
}

这就是从OpenWeatherMap发来的“东京当前天气数据”的原始状态。下一步就是从这种名为JSON的数据格式中提取出我们需要的信息。

【难点解析】如何读取JSON数据
JSON由`{}`(花括号)和`[]`(方括号)组合而成。

在Python中,JSON的`{}`可以当作“字典”处理,`[]`可以当作“列表”处理,因此两者非常兼容。例如,如果你想获取气温(`temp`),你只需要访问`main`这个大分组下的`temp`,所以可以写成`data['main']['temp']`。很简单吧!

第 4 步:来一次真正的应用改造!

好了,从这里开始才是重头戏。我们不再是每次都修改代码,而是让用户能够输入城市名称,并以清晰的方式显示所需信息,让它进化成一个像样的CLI应用。

这次,为了制作一个更正式的CLI应用,我们将使用Python的标准库`argparse`。使用它,你就可以在运行时传递信息,例如`python weather.py Beijing`。

请用以下内容完全替换`weather.py`文件。API密钥的管理方式也改为了更安全的形式。

import requests
import argparse
import os

def get_weather_emoji(weather_main):
    """根据天气英文名返回表情符号"""
    if weather_main == "Clear":
        return "☀️"
    elif weather_main == "Clouds":
        return "☁️"
    elif weather_main == "Rain":
        return "🌧️"
    elif weather_main == "Drizzle":
        return "🌦️"
    elif weather_main == "Thunderstorm":
        return "⛈️"
    elif weather_main == "Snow":
        return "❄️"
    else:
        return "🌫️" # Mist, Smoke, Haze, Dust, Fog, Sand, Ash, Squall, Tornado

def format_weather_data(data):
    """格式化API响应并以字符串形式返回"""
    try:
        city_name = data["name"]
        country = data["sys"]["country"]
        weather_description = data["weather"][0]["description"]
        weather_main = data["weather"][0]["main"]
        emoji = get_weather_emoji(weather_main)
        temp = data["main"]["temp"]
        feels_like = data["main"]["feels_like"]
        humidity = data["main"]["humidity"]
        wind_speed = data["wind"]["speed"]

        # 构建易于阅读的输出字符串
        output = f"[ {city_name} ({country}) 的天气 ]\n"
        output += f"天气: {weather_description} {emoji}\n"
        output += f"气温: {temp}°C (体感温度: {feels_like}°C)\n"
        output += f"湿度: {humidity}%\n"
        output += f"风速: {wind_speed} m/s"
        
        return output
    except KeyError:
        return "解析天气数据失败。响应格式可能无效。"

def main():
    # 1. 从环境变量获取API密钥
    #    为了更安全地管理密钥
    api_key = os.getenv("OPENWEATHERMAP_API_KEY")
    if not api_key:
        print("错误:环境变量 'OPENWEATHERMAP_API_KEY' 未设置。")
        print("请先设置API密钥再重新运行。")
        return # 退出程序

    # 2. 设置命令行参数
    parser = argparse.ArgumentParser(description="显示指定城市的当前天气信息。")
    parser.add_argument("city", help="希望获取天气信息的城市名称 (例如: Beijing)")
    parser.add_argument("-u", "--units", choices=["metric", "imperial"], default="metric", 
                        help="指定温度单位 ('metric' 代表摄氏度, 'imperial' 代表华氏度)")
    
    args = parser.parse_args()
    
    # 3. 向API发送请求
    base_url = "https://api.openweathermap.org/data/2.5/weather"
    params = {
        "q": args.city,
        "appid": api_key,
        "units": args.units,
        "lang": "zh_cn"
    }

    try:
        response = requests.get(base_url, params=params)
        # 如果返回4xx, 5xx错误码,则抛出异常
        response.raise_for_status()

        weather_data = response.json()
        
        # 4. 显示结果
        formatted_output = format_weather_data(weather_data)
        print(formatted_output)

    except requests.exceptions.HTTPError as e:
        if e.response.status_code == 401:
            print("错误:API密钥无效。请检查是否设置了正确的API密钥。")
        elif e.response.status_code == 404:
            print(f"错误:找不到城市 '{args.city}'。请检查城市名称。")
        else:
            print(f"发生了HTTP错误: {e}")
    except requests.exceptions.RequestException as e:
        print(f"发生了通信错误: {e}")
    except Exception as e:
        print(f"发生了意外错误: {e}")


if __name__ == "__main__":
    main()

【重要】安全设置API密钥的方法(环境变量)

我之前提到,直接在代码中写入API密钥是危险的。因此,我们将使用专业开发中也常用的“环境变量”机制。这是一种让你自己的电脑记住API密钥的方法。

对于 Mac / Linux:

export OPENWEATHERMAP_API_KEY="你的API密钥"

对于 Windows (命令提示符):

set OPENWEATHERMAP_API_KEY="你的API密钥"

对于 Windows (PowerShell):

$Env:OPENWEATHERMAP_API_KEY="你的API密钥"

请在你的终端中运行上述命令(关闭终端后设置会重置)。这样,代码`os.getenv("OPENWEATHERMAP_API_KEY")`就能读取到你在电脑中设置的密钥了。

准备好后,我们来运行一下吧!

$ python weather.py Shanghai

上海的天气是不是完美地显示出来了?

接下来,我们来尝试用华氏度(Fahrenheit)显示北京的天气。

$ python weather.py Beijing -u imperial

如果城市名称包含空格,别忘了用`"`(双引号)括起来哦。如果温度以华氏度(°F)显示,就表示成功了!

你也可以故意输入一个错误的城市名称,或者设置一个错误的API密钥,看看错误信息是否能正确显示。这就是“健壮的错误处理”。

总结:超越“它动了!”的下一步

辛苦了!现在,你专属的原创天气预报CLI应用就完成了。除了简单地复制粘贴代码,你还应该学到了以下几点:

在编程学习中,积累这些“小小的成功体验”至关重要。以今天制作的这个应用为基础,不断用你自己的想法去改造它吧,比如“下次尝试同时显示多个城市的天气”、“增加每小时的预报”、“把结果通知到微信”等等。

让“创造能动的东西的乐趣”成为你的燃料,继续在编程世界中冒险吧!

下一步

在Python编程中,每个人都会遇到“缩进错误”。请务必阅读我们详细解释其原因和解决方法。的文章。

IndentationError(缩进错误)的原因和解决方法