大纲环境包管理模块时间API实践环境Python环境:我们回到第一节课没有提到的venv文件夹。这个文件夹其实就是这个项目使用的Python环境目录。项目实际执行的python在venv目录下。为什么不是我们安装Python时的目录呢?Pycharm默认在创建项目时,会根据我们安装的Python在项目下创建一个虚拟环境。这个虚拟环境专用于这个项目,干净且不受其他项目的影响。Cleantoexpress是最原始的Python环境。不干涉的作用体现在多个??项目对环境的依赖程度不同,甚至可能发生冲突。我们也可以选择安装原环境进行开发。包管理包[Package]是环境依赖中最重要的内容。包其实就是一个程序目录,里面包含了很多模块,方便我们调用。比如上一节课用到了一个re模块,它是Python自带包中的一个模块。Python自带包,安装好Python后可以直接使用。除了我们自己的包,我们还需要使用第三方的包。大量的第三方包是支撑Python开发的重要一环。Python现在几乎适用于所有开发领域。Pycharm中的包管理:进入配置File=>Settings选择Projectcode>ProjectInterpreter,进入packagemanagement包管理界面。安装包显示包名,当前版本【Version】,最新版本【Lastestversion】。默认情况下有两个包,pip和setuptools,它们是Python用来管理包的,必须存在。添加包:点击加号[+],我们输入requests[请求的包]。选择正确的包后,点击InstallPackage进行安装。安装成功后,我们会看到requests包。这时候你会发现包多了很多。这些包就是requests包【依赖包】中需要调用的包,使用requests也必须安装这些包。国内源:安装时大家可能会觉得速度很慢,所以我们会使用国内源。国内源是位于国内的服务器,访问速度比默认快。【默认服务器在国外】在安装包页面,点击ManageRepositories。默认地址是https://pypi.python.org/simple。我们点击加号[+]来添加源。添加来源:输入地址,我选择的是阿里的来源。再次搜索包,会有两个包,选择阿里源下载会更快。国内常用的几个源清华:https://pypi.tuna.tsinghua.ed...阿里云:https://mirrors.aliyun.com/py...中国科学技术大学https://pypi.镜子。ustc.edu...豆瓣:https://pypi.douban.com/simplemodule一个模块就是一个Python文件。文件包含方法和类,或其他任何内容。我们之前写的程序都是在一个文件里面实现的,其实就是一个模块。为了实现代码复用,我们会将方法和类放入模块中,由另一个可执行文件调用。创建模块:我们编写一个utils工具模块。创建一个utils.py文件,写两个方法。和以前没什么不同。defwarning(content):print('【warning】{}'.format(content))deferror(content):print('【error】{}'.format(content))模块调用:import,from.importutilsutils.warning('s')utils.error('ss')import后跟模块名,模块导入完成。然后我们可以通过模块名称调用该方法。另一种方式是fromimport,特点是import后不需要用模块名调用,直接使用方法或类。from...import表示从模块中导入方法或类。fromutilsimport*warning('s')error('ss')星号[*]代表导入所有方法或类。fromutilsimportwarningwarning('ss')或直接指定要导入的方法或类,以逗号分隔。fromutilsimportwarning,error创建包:通过创建包来收集和管理模块。右键单击=>新建=>Python包我们创建一个api模块。创建的包在包下显示为默认的__init__.py文件,Python使用该文件将目录标识为包。我们在api包下创建几个模块来编写下面要学习的API请求函数。Time在写API之前,我们先学习使用一个常用的内置模块【time】:datetime。时间模块是Python附带的用于处理时间的包。我们可以很容易地按时操作。导入包:importdatetimemodulefromdatetimeimportdatetimetimemodule导入时一般使用from的方式,调用时比较简单。由于这个包一般是用来做时间处理的,所以一般不会出现模块重名引起的冲突。获取当前时间:使用datetime模块下的now方法获取当前时间。now=datetime.now()print('nowtimeis'+str(now))输出时间信息:我们得到了时间,但是打印的时候不是我们想要的格式。通过获取时间的年、月、日、时、分、秒、毫秒等信息,组合出我们想要的时间。year=now.year#yearmonth=now.month#monthday=now.day#dayhour=now.hour#hourminute=now.minute#minutesecond=now.second#secondmicrosecond=now.microsecond#millisecondt=int(now.timestamp())#Timestamp时间戳是一个10位数字,代表从1970年1月1日0:00开始经过的秒数,是开发过程中常用的一种度量方式。自定义格式:print(str(year)+'-'+str(month)+'-'+str(day))print('{}-{}-{}'.format(year,month,day))时间格式:strftime。时间的格式与字符串不同,使用以百分号%开头的标准替换字符。importlocalelocale.setlocale(locale.LC_CTYPE,'chinese')#解决中文问题print(now.strftime('%Yyear%mmonth%dday%Wweek%w'))timecreation:onewaywe可以是通过反向格式化[strptime]完成。date=datetime.strptime('March16,2019','%y%mmonth%dday')print(date)datetime的strptime方法第一个参数是要转换的时间,第二个参数是时间格式。尝试:birthday=input('Enteryourbirthday(eg:2019-03-16)?')birthday=datetime.strptime(birthday,'%Y-%m-%d')print(birthday)exceptExceptionase:print('时间格式输入错误')对象创建:对象创建是时间创建的另一种方式,是一种面向对象的编程方式。面向对象的内容将在下一节课中详细介绍。datetime其实是一个类,可以直接创建生成。birthday=datetime(year=2019,month=3,day=16)如上代码,可以直接调用datetime类创建时间对象。通过控制键,我们可以输入它调用的具体方法的内容。__init__是调用的类构造方法,self暂时忽略,后面的参数是方法的参数。我们可以随时创建。时间计算:timedelta。除了datetime模块,我们还需要引入timedetla模块。fromdatetimeimportdatetime,使用加号和减号执行timedelta计算。yesterday=now-timedelta(days=1)#昨天减去一天delta=now-yesterday#timeprint(delta.days)#timedelta的参数包括周、秒、分钟、小时等。APIAPI请求是开发过程中常用的功能。我们使用刚刚安装的请求包来执行此操作。例子:在时间模块中,我们只能知道星期几来判断是否是节假日。在实践中,我们还需要知道某一天是否是假期要求。这时候我们就需要API的帮助了。我们选择了聚合数据[https://www.juhe.cn/],一个第三方平台的免费API来讲解。万年历【https://www.juhe.cn/docs/api/...】就是我们要使用的API。注册、认证、申请API成功。我们可以在【测试】中调试这个接口,也可以使用Postman。调试好之后,我们就可以开始写代码了。模块编写:首先导入需要的包,定义两个变量:聚合平台的URL地址和申请的appkey。fromdatetimeimportdatetime#timepackageimportrequests#请求包appkey='xxxxxxxxxxxxxxxxxx'#应用的appkeyjuhe_url='http://v.juhe.cn/'#URL请求聚合数据的基本使用:response=requests.get(url=url,headers=headers,params=params)#获取请求response=requests.post(url=url,headers=headers,data=params)#post请求params和data都是字典类型,说明这两个请求参数。headers也是一个字典,代表HTTP请求头。写法:defcalendar_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)ifresponse.status_code==200:#请求成功returnresponse.content#返回结果else:returnNone#请求失败请求完成后,响应。status_code是请求返回的状态码,200表示请求正常。response.content是返回的内容。当状态码不为200时,返回空值None表示请求失败。返回的内容是JSON格式的,我们还不能直接使用。JSON:该接口返回的内容为json。{"reason":"成功","result":{"data":{"holiday":"元旦","avoid":"伐.集.破","animalsYear":"兔","desc":"2012年1月1日","weekday":"星期日","suit":"祭祀.开光.理发","lunarYear":"辛卯年","lunar":"正月初八lunarmonth","year-month":"2012-1","date":"2012-1-1"}},"error_code":0}Json是一种用于数据传输的数据格式。它与Python的字典列表组合具有相同的结构。所以我们可以在json和python格式之间进行转换。importjson#将json格式转为python格式data=json.loads(content)print(data)#将python格式转为json格式content2=json.dumps(data)print(content2)parseJSON:returnjson.loads(response.content)或者使用封装的方法response.json也很方便。returnresponse.json()调用这个模块:写一个is_holiday方法判断fromapiimportjuhe#从api包导入juhe模块fromdatetimeimportdatetimedefis_holiday(date=datetime.now()):info=juhe.calendar_day(date)#获取数据ifinfo不为Noneandinfo['reason']=='Success':#验证数据是否正确result=info['result']if'holiday'inresult:returnTrue#当有holiday,表示Holidayelse:returnFalsereturnNoneExercise1.为请求模块的练习选择一个API。2.对于is_holiday方法,我们的免费请求一天只有100次。假设我们可能有很多用户,每天的请求次数远不止100次。我们现在只需要今天的数据,怎么能不付钱呢?github:https://github.com/lvancer/course_python
