【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次。
我们现在只需要今天的数据,如何可以使我们不付费?