常用的内建模块
Python内置了许多有用的模块,无需额外安装和配置,可以直接使用.
datetime
它是Python处理如期和时间的标准库.
获取当前日期和时间:
|
|
解释:datetime是一个模块,导入的是这个模块中的datetime类,如果仅仅是
import datetime,需要使用全类名,datetime.datetime.
datetime.now()是当前的时间和日期,类型是datetime类型.
获取指定的时间和日期:
|
|
datetime转换为timestamp
首先,什么是timestamp?通常把1970年1月1日,00:00:00 UTC+00:00时区的时刻称为epoch time,记做0,把当前时间相对于epoch time的秒数,叫做timestamp.
直接调用timestamp()方法,就可以获取当前时间的timestamp:
|
|
timestamp是一个浮点数,没有时区的概念,datetime是有时区的,这里只是对时间进行转换.
2017-04-01 09:50:00 实际上相当于 2017-04-01 09:50:00 UTC+8:00
timestamp直接转换为UTC时区标准时间:
|
|
本地时区为东8区,比UTC时区差了8小时.
str转换为datetime
将字符串类型的日期和时间,转换为datetime,调用datetime.strptime()方法和一个日期时间的格式化字符串:
|
|
这个字符串规定了日期和时间的格式,参考Python文档
转化后的datetime是没有时区信息的.
datetime转化为str
将一个datetime对象转化为字符串,通过strftime()方法实现,和一个格式化日期和时间的字符串:
|
|
时间的加减计算
datetime加减计算,就是把datetime往后或向前计算,得到新的datetime,加减可以直接用 + 和 - 运算符,需要导入timedelta.
|
|
timedetla()方法可以算出,前后几天的日期和时间.
本地时间转换为UTC时间
本地时间是指带有时区信息的时间,北京时间为UTC+8:00时区的时间,UTC时间是指UTC+0:00时区的时间.
datetime类型有tzinfo时区属性,默认为None,无法区分这个datetime是哪个时区的时间,可以强行设置一个时区.
|
|
时区转化
通过utcnow()拿到当前的UTC时间,转转换为任意时区时间:
|
|
通过带有时区的datetime,调用astimezone()方法,可以转换到任意时区.
datetime表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间.
要存储datetime的话,最好是将datetime转换为timestamp来存储,timestamp的值与时区没有关系.
练习
假设你获取了用户输入的日期和时间如2015-1-21 9:01:30,以及一个时区信息如UTC+5:00,均是str,请编写一个函数将其转换为timestamp:
|
|
collections
是Python内置的集合模块,提供了一些集合类.
namedtuple
它是一个函数,用来创建自定义的tuple对象,规定了tuple元素的个数,并且可以用属性而不是索引来引用tuple的某个元素.
|
|
还可以验证创建的Name是不是tuple对象:
|
|
deque
是为了高效实现插入和删除操作的双向列表,使用list存储数据时,由于list是线性存储,数据量大的时候,插入和删除的效率很低.
|
|
deque还支持appendleft()和popleft()方法,更方便的从开始位置插入和删除.
defaultdict
在使用defaultdict时候,如果key不存在,可以返回一个默认值,而使用dict时,如果key不存在,会报错KeyError.
|
|
defaultdict和dict的区别就是如果key不存在就返回默认值,其他的和dict一样.
OrderedDict
在使用dict时候,如果想要保持key的顺序,就可以使用OrderedDict.
|
|
需要注意的是,OrderedDict的key是按照插入的顺序排列,不是key本身的顺序.
OrderedDict可以实现先进先出的dict,当容量超出限制时,先删除最早插入的Key
Counter
它是一个简单的计数器,可以统计字符出现的个数:
|
|
Counter是dict的一个子类
|
|
base64
Base64是一种用64个字符来表示任意二进制数据的方法.
通常再用记事本打开exe,jpg,pdf等文件时,会看到一堆乱码,这是因为二进制文件中包含很多无法显示和打印的字符,如果要让记事本这样的文本处理软件能够处理二进制数据,就需要一个二进制到字符串的转换方法,Base64就是一种常见的二进制编码的方法
首先准备一个含有64个字符的数组
|
|
然后对二进制数据进行处理,没3个字节一组,一共是3*8=24bit(一个字节,8个bit),
化为4组,每组刚好是6个bit.
然后,得到4个数字作为索引,查表,获得相应的4个字符,就是编码后的字符串.
Base64会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文,网页等直接显示.
如果要编码的数据不是3的倍数,最后会有剩余,Base64会用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码时候,会自动去掉.
|
|
标准的Base64编码后可能会出现字符 + 和 / ,在URL中不能直接作为参数.
urlsafe的base64编码可以把字符 + 和 / 分别变成 - 和 _
|
|
Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行.
Base64适用于小段内的编码,如:数字证书签名,Cookie的内容.
由于 = 字符也可能出现在Base64编码中,但 = 在URL,Cookie里面会造成歧义,所以,很多Base64编码后会把 = 去掉.
因为Base64是把3个字节变为4个字节,Base64编码的长度是4的倍数,因此,需要加上 = 把Base64字符串的长度变为4的倍数,就可以正常解码了.