【Python教程】05.模块与API
大纲
- 环境
- 包管理
- 模块
- 时间
- API
- 练习
环境
Python环境:我们回到第一次课上没有说到的venv
这个文件夹。
这个文件夹其实就是这个项目所使用的Python环境目录
。项目实际执行的python在venv目录下。
为什么不是我们安装Python时的目录?
Pycharm在默认创建项目时会根据我们安装的Python创建一个虚拟环境
在项目下。
这个虚拟环境是这个项目专用
的,是干净
的,可以不受
其他项目的影响
。干净
要表达的是最原始
的Python环境。互不影响
的作用体现在多个项目对环境的依赖
不同,甚至可能冲突
。
我们也可以选择安装的原始环境进行开发。
包管理
包【Package】就是环境依赖中最主要的内容。
包其实就是一个程序目录
,在这个目录下包含了许多模块
,方便我们调用。
如上次课就使用到了一个 re 模块就是Python自带包里的一个模块。
Python自带包
,在安装了Python后就可以直接使用。
除了自带包,我们还要使用到第三方包
。
大量的第三方包是支撑Python开发的重要一环。现在几乎所有的开发领域都可以使用Python。
Pycharm中的包管理:进入配置 File
=> Settings
选择Project code
> Project Interpreter
进入包管理
包管理界面
已安装的包显示了包的名称
,当前版本
【Version】,以及最新的版本
【Lastest version】。默认
情况下会有pip
和setuptools
两个包,这两个是Python
用来管理包的包
,必须存在。
添加包:点击加号【+
】
我们输入requests
【一个用于请求的包】。
选择正确的包后,点击Install Package
进行安装
安装成功
我们就看到了requests包,这时你会发现还多了很多的包。
这些包时requests包里需要调用的包【依赖包
】,要使用requests也必须安装这些包。
国内源:在安装时,你可能会觉得速度很慢,这时我们就要使用国内源。
国内源就是设在国内的服务器,访问速度比默认的要快。【默认服务器在国外】
在安装包页面,点击Manage Repositories
默认的地址就是https://pypi.python.org/simple
我们点击加号【+
】,添加源。
添加源:输入地址,我选择了阿里的源。
再次搜索包就会出现两个,选择阿里源下载就比较快。
几个常用的国内源
清华:https://pypi.tuna.tsinghua.ed...
阿里云:https://mirrors.aliyun.com/py...
中国科技大学 https://pypi.mirrors.ustc.edu...
豆瓣:https://pypi.douban.com/simple
模块
模块就是一个Python文件
。文件中包含方法和类
,或者其他内容。
我们之前所写的程序都是在一个文件中实现,其实这也是一个模块。
为了实现代码复用
,我们会将方法和类放到模块中去,并由另一个执行文件来调用。
创建一个模块:我们编写一个utils
工具模块。
创建utils.py
文件,写入两个方法。与之前没有任何的不同。
def warning(content): print('【warning】{}'.format(content)) def error(content): print('【error】{}'.format(content))
模块调用:import
、from
。
import utils utils.warning('s') utils.error('ss')
import
后跟上模块名
,就完成了模块的导入。
然后我们就可以通过模块名调用
到该方法。
另一种方式是from导入
,特点是导入后不需要用模块名调用,直接使用方法或类。from … import
表示从某个模块中导入方法或类。
from utils import * warning('s') error('ss')
星号【*
】代表导入所有
的方法或类。
from utils import warning warning('ss')
或者直接指定
要导入的方法或类,多个用逗号隔开
。
from utils import warning, error
创建包:通过创建包,将模块集合起来管理。右键
=> New
=> Python Package
我们创建一个api模块。
创建好的包显示为
包下面默认有个__init__.py
文件,是Python用来标识
该目录为包的。
我们在api包下创建几个模块,来编写我们下面要学习的API请求功能。
时间
在编写API之前,我们先学习使用一个常用的内置模块
【时间】:datetime
。
时间模块是用来处理时间的Python自带的包。我们可以方便的对时间进行操作。
导入包:从datetime包中导入datetime模块
from datetime import datetime
时间模块在导入上一般使用from的模式,这样在调用时比较简单。
由于在时间处理上一般都用该包,所以一般也不会有同名模块造成的冲突。
获取当前时间:使用datetime模块下的now
方法获得当前时间。
now = datetime.now() print('现在时间是' + str(now))
输出
时间信息:我们获得了时间,但是打印时并不是我们想要的格式。
通过获取时间的年、月、日、时、分、秒、毫秒等信息,来组合我们要的时间。
year = now.year # 年 month = now.month # 月 day = now.day # 日 hour = now.hour # 时 minute = now.minute # 分 second = now.second # 秒 microsecond = now.microsecond # 毫秒 t = int(now.timestamp()) # 时间戳
时间戳
是一个10位的数字,代表了从1970年1月1日0点开始所经历的秒数,是开发过程中常用的计量方式。
自定义格式:
print(str(year) + '-' + str(month) + '-' + str(day)) print('{}-{}-{}'.format(year, month, day))
时间格式化:strftime
。时间的格式化与字符串不同,使用百分号%
起头的标准替换符
。
import locale locale.setlocale(locale.LC_CTYPE, 'chinese') # 解决中文问题 print(now.strftime('%Y年%m月%d日 第%W周 星期%w'))
时间创建:一种方式我们可以通过反格式化
【strptime
】来进行。
date = datetime.strptime('2019年3月16日', '%Y年%m月%d日') print(date)
datetime
的strptime
方法第一个参数是要转换的时间
,第二个参数是时间格式
。
try: birthday = input('输入你的生日(例:2019-03-16)? ') birthday = datetime.strptime(birthday, '%Y-%m-%d') print(birthday) except Exception as e: print('时间格式输入错误')
对象创建:对象创建是另一种时间创建方式,是面向对象
的编程方式。面向对象的内容,下次课会详细介绍。datetime
其实是一个类
,可以通过直接创建来生成。
birthday = datetime(year=2019, month=3, day=16)
如上的代码,直接调用datetime类,就可以创建出时间对象
。
通过control
键,我们可以进入其所调用的具体方法内容。__init__
就是调用的类构造方法
,self
暂时不管,后面的参数就是该方法的参数。
我们就可以创建任意时间了。
时间计算:timedelta
。
除了datetime
模块,我们还需要引入timedetla
模块。
from datetime import datetime, timedelta
计算使用加减号进行。
yesterday = now - timedelta(days=1) # 昨天,减去一天 delta = now - yesterday # 时间 print(delta.days) # 相差几天
timedelta
的参数还有weeks
、seconds
、minutes
、hours
等。
API
API请求是开发过程常用的一个功能。我们使用刚刚安装的requests
包来完成。
实例:时间模块中,我们只能知道某一天是周几来判断是不是放假。
实际中我们还需要知道某天是不是放假的需求。这时我们就需要API的帮助了。
我们选择了聚合数据
【 https://www.juhe.cn/ 】这个第三方平台的免费API进行讲解。万年历
【 https://www.juhe.cn/docs/api/...】就是我们要使用的API。
注册、认证、申请该API成功后。
我们可以在【测试
】中进行该接口的调试,或者使用Postman
进行。
调试完成后我们就可以开始写代码了。
模块编写:
先导入需要的包,并定义两个变量聚合平台的URL地址
和申请到的appkey
。
from datetime import datetime # 时间包 import requests # 请求包 appkey = 'xxxxxxxxxxxxxxxxx' # 申请到的appkey juhe_url = 'http://v.juhe.cn/’ # 聚合数据的网址
requests的基本使用:
respone = requests.get(url=url, headers=headers, params=params) # get请求 respone = requests.post(url=url, headers=headers, data=params) # post请求
params
和data
都是字典
类型,表示两种请求中的参数
。headers
也是字典
,表示http请求头
。
编写方法:
def calendar_day(date=datetime.now()): url = juhe_url + 'calendar/day' params = { 'date': date.strftime('%Y-%m-%d'), 'key': appkey } response = requests.get(url=url, params=params) if response.status_code == 200: # 请求成功 return response.content # 返回结果 else: return None # 请求失败
在请求完成后,response.status_code
是请求返回的状态码,200
表示请求正常。response.content
是返回内容。
当状态码不是200时,返回空值None
表示请求失败
。
返回的内容是JSON
形式,我们暂时还无法直接使用。
JSON:该接口返回内容就是JSON
。
{ "reason":"Success", "result":{ "data":{ "holiday":"元旦", "avoid":"伐木.纳畜.破", "animalsYear":"兔", "desc":"2012年1月1日", "weekday":"星期日", "suit":"祭祀.开光.理发", "lunarYear":"辛卯年", "lunar":"腊月初八", "year-month":"2012-1", "date":"2012-1-1" } }, "error_code":0 }
Json是一种数据格式
,用于数据的传输
。
其与Python的字典列表组合的结构是一样的。
所以我们可以将JSON
和Python
格式互相转换
。
import json # json格式转换为python格式 data = json.loads(content) print(data) # python格式转换为json格式 content2 = json.dumps(data) print(content2)
解析JSON:
return json.loads(response.content)
或者使用封装好的方法response.json
也很方便。
return response.json()
调用该模块:编写了一个is_holiday方法来判断
from api import juhe # 从api包导入juhe模块 from datetime import datetime def is_holiday(date=datetime.now()): info = juhe.calendar_day(date) # 获得数据 if info is not None and info['reason'] == 'Success': # 验证数据正确 result = info['result'] if 'holiday' in result: return True # 有holiday时,表示时假日 else: return False return None
练习
1、选择一个API进行请求模块的练习。
2、对于is_holiday这个方法,我们免费的请求次数只有每天100次,
假设我们的用户可能有很多,每天的请求量远不止100次。
我们现在只需要今天的数据,如何可以使我们不付费?