Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何在Python中创建天气警报系统

如何在Python中创建天气警报系统

作者头像
HuangWeiAI
发布于 2020-12-18 03:25:39
发布于 2020-12-18 03:25:39
2.6K00
代码可运行
举报
文章被收录于专栏:浊酒清味浊酒清味
运行总次数:0
代码可运行

前言

通过阅读这篇文章,你将学会用Python创建一个天气警报系统,当它预测未来几小时内天空将下雨/下雪时,它会向多个收件人发送一封电子邮件通知。电子邮件通知包含其他信息,如预测的温度和湿度。

本教程有3个部分:

1.设置

2.实现

3.结果

设置

天气API

我们将使用ClimaCell的天气API来获取预报天气数据。根据您的需要,它提供了相当多的有用和准确的数据。

它涵盖了4周以前的历史站点数据以及15天以前的每日预报数据。此外,你可以很容易地实现它的官方文件提供参考4种不同的计算机语言:

  • JavaScript
  • Ruby
  • Node
  • Python

前往注册和注册一个新帐户。一旦完成,您应该会看到下面的指示板,它概述了计划细节和您的调用活动。

请注意API键,因为我们将在后面的代码中使用它。

邮件配置

我将使用个人Gmail账号通过SMTP给自己发邮件。为了使用它,你需要改变帐户设置的配置,并打开不太安全的应用程序访问。

转到帐户设置,然后点击安全菜单。

打开不太安全的应用访问,如下所示

完成之后,在项目的根目录中创建一个名为config.ini的新文件。它将被用作我们项目的配置文件。将以下代码添加到其中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[email]
email=your_email@gmail.com
host=smtp.gmail.com
port=587
password=your_password
  • 电子邮件-您的电子邮件帐户的名称
  • 主机- smtp服务器的主机名。修改这个基于smtp服务器为您的电子邮件
  • 端口-用于smtp服务器的端口。修改这个基于smtp服务器为您的电子邮件
  • 密码-密码到您的电子邮件帐户。请务必不要将此文件或信息泄露给其他人。

Python模块

强烈建议为这个项目创建一个虚拟环境。在终端中运行以下命令来安装configparser模块。它在从文件加载配置设置时非常有用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install configparser

实现

在与config.ini相同的目录中创建一个名为weather_email.py的新文件。这个文件作为我们的应用程序的电子邮件模块。

import

在文件的顶部添加以下导入声明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try:
    import configparser
except:
    from six.moves import 
    configparserimport smtplib
from email.mime.multipart import 
MIMEMultipart
from email.mime.text import MIMEText
import requests

接下来,创建一个字典,表示在下雨或下雪时我们将要发送的消息。您可以根据您的用例创建自己的映射或自定义消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
weather_dict = {'freezing_rain_heavy':
 'Heavy rain and snow', 'freezing_rain':
 'Rain and snow', 'freezing_rain_light':
 'Light rain and snow', 'freezing_drizzle': 
 'Light drizzle and snow', 
 'ice_pellets_heavy': 
 'Heavy ice pellets', 
'ice_pellets': 'Normal ice pellets', 
'ice_pellets_light': 'Light ice pellets', 
'snow_heavy': 'Heavy snow', 'snow':
 'Normal snow', 'snow_light': 
'Light snow', 'tstorm': 'Thunder storm',
 'rain_heavy': 'Heavy rain', 'rain': 
 'Normal rain', 'rain_light': 'Light rain'}

天气API设置

初始化调用weather API时需要的以下变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
url = "https://api.climacell.co/v3/
weather/nowcast"
querystring = 
{"lat":"1.29027","lon":"103.851959",
"unit_system":"si","timestep":
"60","start_time":"now","fields":
"temp,humidity,weather_code","apikey"
:"xxxx"}

我们将调用nowcast API,它有以下参数,可以修改:

  • 纬度,-87至89
  • 经度,-180到180度
  • unit_system—单位制,“si”或“us”
  • 时间步长-时间步长,分1到60。将start_time设置为现在并将timestep设置为60将返回7个数据点。(现在,60分钟后,120分钟后,……)
  • start_time—您可以设置自己的时间,或者现在就初始化它
  • end_time—限制结束时间的可选参数。默认情况下,它将返回距离当前时间戳最多6小时的数据。
  • 字段-从所提供的数据层中选择的字段(如“降水”或“阵风”)。我在本教程中使用了temp,湿度和weather_code。
  • apikey -来自Climacell天气API仪表板的API键

邮件发送者类

我们将创建一个名为EmailSender的新类,并像下面这样初始化它。我们使用configparser模块从config.ini中读取数据,并将其分配给相应的变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def __init__(self):
    self.cf = configparser.ConfigParser()
    self.cf.read('./config.ini')
    self.sec = 'email'
    self.email = self.cf.get(self.sec, 
    'email')
    self.host = self.cf.get(self.sec, 'host')
    self.port = self.cf.get(self.sec, 'port')
    self.password = self.cf.get(self.sec, 
    'password')

在类内部创建另一个函数SendEmail,它接受一个接收者参数。它接受列表而不是字符串。这允许我们向多个电子邮件地址发送相同的电子邮件通知。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def SendEmail(self, recipient):

在函数内部,使用以下代码初始化一个新的MIMEMultipart对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
title = "Home Sweet Home"msg = MIMEMultipart()
msg['Subject'] = '[Weather Notification]'
msg['From'] = self.email
msg['To'] = ', '.join(recipient)

调用天气API

下一步是通过请求模块调用API,它将以json的形式返回结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
response = requests.request
("GET", url, params=querystring)
result = ""json_data = response.json()

您可以充分利用结果并将其映射到我们在上面指定的字典,以便创建所需的通知消息。然后,用它初始化一个MIMEText对象,并将其附加到MIMEMultipart对象。通过调用smtplib结束它。SMTP上下文管理器发送电子邮件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
msgText = MIMEText('<b>%s</b><p>%s</p>' 
% (title, result), 'html')
msg.attach(msgText)with smtplib.SMTP
(self.host, self.port) as smtpObj:
    smtpObj.ehlo()
    smtpObj.starttls()
    smtpObj.login(self.email, self.password)
    smtpObj.sendmail(self.email, 
    recipient, msg.as_string())

查看以下网址以获得完整的代码:

https://gist.github.com/wfng92/f5af6144053aeab514e5ff330949b112

您的根目录中应该有以下文件。

  • config.ini
  • weather_email.py

只要这两个文件与您调用的Python文件位于同一目录中,您就可以在任何Python应用程序中轻松触发电子邮件警报功能。只需根据您的用例修改import语句。下面的示例概述了在未来6小时内下雨或下雪时向两个收件人发送电子邮件通知的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import weather_emailemail_obj = 
weather_email.EmailSender()
email_obj.SendEmail(["email@gmail.com",
 "email2@gmail.com"])

结果

让我们看一下运行测试时的结果。我接到通知,说我家下着小雨。

当雨停的时候,我运行了相同的代码,预报说6小时后还会下雨。也许我应该在下雨之前回去把我所有的衣服从晾衣架上取下来。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python学会 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
关于python正则表达式
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
python与大数据分析
2022/03/11
3260
关于python正则表达式
前端进阶必须知道的正则表达式知识
正则表达式(Regular Expression) 是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。
石燕平
2019/12/03
7410
Python-re模块-正则表达式模块常用方法
Python的re模块提供了正则表达式的功能,可以用来进行高级的字符串匹配和处理。re模块的主要功能包括:
用户9006224
2023/10/11
3030
Go语言中的正则表达式:详细指南
在Go语言中,使用regexp.Compile函数编译正则表达式。编译后的正则表达式可以重复使用,提高了执行效率。
数字扫地僧
2024/06/27
3950
Scala 学习笔记之正则表达式
我们可以使用 scala.util.matching.Regex 类使用正则表达式.要构造一个 Regex 对象,使用 String 类的 r 方法即可:
smartsi
2019/08/07
7730
【Python】正则表达式的艺术:轻松驾驭 Python 的re库
本文将会先介绍什么是正则表达式,然后在介绍正则表达式在python中的应用。 下方图片及案例思路来自:正则表达式
Yui_
2024/12/20
1510
【Python】正则表达式的艺术:轻松驾驭 Python 的re库
JavaScript 又出新特性了?来看看这篇就明白了
https://juejin.im/post/5ca2e1935188254416288eb2
崔庆才
2019/05/06
1.6K0
Java基础——正则表达式与基础类应用
组捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
阿Q说代码
2021/05/13
4200
尚学堂-马士兵-专题-正则表达式
正则表达式是处理字符串的。 其实更确切的说,正则表达式是处理字符的。 就拿上面的例子来说, 每一个点代表一个字符。 那么abc是不是三个字符呀?是, 所以满足条件。
用户7798898
2020/09/27
1.2K0
尚学堂-马士兵-专题-正则表达式
写爬虫,不会正则怎么行?
很多人觉得正则很难,在我看来,这些人一定是没有用心。其实正则很简单,根据二八原则,我们只需要懂 20% 的内容就可以解决 80% 的问题了。我曾经有几年几乎每天都跟正则打交道,刚接手项目的时候我对正则也是一无所知,花半小时百度了一下,然后写了几个 demo,就开始正式接手了。三年多时间,我用到的正则鲜有超出我最初半小时百度到的知识的。
丹枫无迹
2019/08/20
5370
正则表达式介绍
Regex(英语:Regular Expression,在代码中常简写为 regex 、 regexp 或 RE ),又称正规表示式、正規表示法、正規運算式、規則運算式、常規表示法,是计算机科学的一个概念 ,正则表达式是一种编写匹配字符串的模式的方法。通常这些模式可用于搜索特定事物的字符串,或搜索然后替换某些事物等。正则表达式非常适合字符串操作!
iOSDevLog
2019/04/18
4.9K0
正则表达式介绍
ES9的新特性:正则表达式RegExp
正则表达式是我们做数据匹配的时候常用的一种工具,虽然正则表达式的语法并不复杂,但是如果多种语法组合起来会给人一种无从下手的感觉。
程序那些事
2021/04/07
5530
代码之美,正则之道
导语 “如果罗列计算机软件领域的伟大发明,我相信绝对不会超过二十项,在这个名单当中,当然应该包括分组交换网络,Web,Lisp,哈希算法,UNIX,编译技术,关系模型,面向对象,XML这些大名鼎鼎的家伙,而正则表达式也绝对不应该被漏掉。”-- Jeffrey Friedl《精通正则表达式》序言 从1956年至今,正则表达式活跃了半个多世纪,其热度依然不减,可见技术半衰期之长,因此,学习正则,不但重要,且受益漫长。 本文涉及 js、php、java、python、bash 等语言,共计 1.2w 字,适
腾讯技术工程官方号
2019/07/31
1.3K0
代码之美,正则之道
正则表达式
一、定义 正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式中的元字符 eg:"\\dhello"中的\\d就是有特殊意义的元字符,代表0--9数字中的任意一个,而9hello,1hello都是和正则表达式\\dhello匹配的字符串  ------------------------------------------------------------------------------------------------------------------------------
听着music睡
2018/05/18
8130
Python实战之字符串和文本处理
「 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波」
山河已无恙
2023/01/30
1.1K0
小览 ES6-ES2019 中正则表达式的新发展
在此前的 《JS正则表达式--从入门到精分》 一文中,曾经较完整的介绍过 Javascript 中正则表达式的用法。而从 ES6(ES2015) 开始,借助 Babel 等标志性的工具,JS 的发展似乎也不想重蹈 Flash 时代的无所作为,走上了每年一个小版本的快车道;在此过程中,正则表达式也陆续演化出一些新的特性。
江米小枣
2020/06/15
6690
一天学完spark的Scala基础语法教程十一、正则表达式(idea版本)
你可以使用 mkString( ) 方法来连接正则表达式匹配结果的字符串,并可以使用管道(|)来设置不同的模式:
红目香薰
2022/11/29
1.1K0
一天学完spark的Scala基础语法教程十一、正则表达式(idea版本)
正则的扩展
ES6 改变了这种行为。如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式会忽略原有的正则表达式的修饰符,只使用新指定的修饰符。
小小杰啊
2022/12/21
9890
ES7、ES8、ES9、ES10新特性大盘点
从 ECMAScript 2016(ES7)开始,版本发布变得更加频繁,每年发布一个新版本,好在每次版本的更新内容并不多,本文会细说这些新特性,尽可能和旧知识相关联,帮你迅速上手这些特性。
心莱科技雪雁
2019/12/11
2K0
ES7、ES8、ES9、ES10新特性大盘点
ES2018新特性学习
ECMAScript 2018 (ES9) 在 6 月底正式发布,带来了很多新特性。关于 ES7 和 ES8 相关的知识,可以查看这篇文章 ES2016 和 ES2017 学习。目前大部分 ES7 和 ES8 的特性都得到主流浏览器的支持,而 ES9 的新特性还未能实现很好的兼容性。
李振
2021/11/26
6590
相关推荐
关于python正则表达式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验