datetime:
表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。如果要存储datetime
,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关。
datetime.strptime() :转换为str; timedelta :加减
1 from datetime import datetime,timedelta,timezone 2 # 获取当前时间; 3 now = datetime.now() 4 print(now) 5 print(now.strftime('%Y-%m-%d %a %b %H:%M:%S')) #把当前时间格式化为str; 6 now = now + timedelta(days=1,hours=2) #datetime的加减,datedelta 7 print(now) 8 9 输出: 10 2019-01-02 11:18:16.947696 11 2019-01-02 Wed Jan 11:18:16 12 2019-01-03 13:18:16.947696
tzinfo :时区属性; utcnow() :获取当前UTC时间; astimezone() :转换到任意时区; replace() :设置
1 from datetime import datetime,timedelta,timezone 2 now = datetime.now() 3 #本地时间转换为UTC时间, 4 tz_utc_8=timezone(timedelta(hours=8)) 5 print(tz_utc_8) 6 #强制设置当前的UTC时间 7 dt = now.replace(tzinfo=tz_utc_8) 8 print(dt) 9 #拿到UTC时间,并强制设置时区为UTC+0:00: 10 utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc) 11 #astimezone()转换时区为北京时间: 12 bj_utc = utc_dt.astimezone(timezone(timedelta(hours=8))) 13 print(utc_dt,bj_utc) 14 15 输出: 16 UTC+08:00 17 2019-01-02 11:19:35.873844+08:00 18 2019-01-02 03:19:35.873844+00:00 2019-01-02 11:19:35.873844+08:00
fromtimestamp() :转为datetime; timestamp() :转为浮点数; utcfromtimestamp() :UTC时间; strftime() :datetime转为str; strptime() :str转为datetime
1 from datetime import datetime,timedelta,timezone 2 #用指定日期时间创建:datetime; 3 m = datetime(2019,1,2,3,4,5) 4 n = m.timestamp() #把datetime转换为timestamp,浮点数; 5 print(m,n) 6 print(datetime.fromtimestamp(n)) #把timestamp转换为datetime; 7 print(datetime.utcfromtimestamp(n)) #转换为UTC时间; 8 day_1 = datetime.strptime('2015-1-1 1:1:1','%Y-%m-%d %H:%M:%S') #str转换为datetime 9 day_2 = day_1.strftime('%Y-%m-%d %a %b %H:%M:%S') #datetime转换为str 10 print(day_1,day_2) 11 12 输出: 13 2019-01-02 03:04:05 1546369445.0 14 2019-01-02 03:04:05 15 2019-01-01 19:04:05 16 2015-01-01 01:01:01 2015-01-01 Thu Jan 01:01:01
collections:Python内建的一个集合模块,提供了许多有用的集合类。(参考:python官网文档)
- namedtuple:创建一个自定义的 tuple 对象,并且规定了 tuple 元素的个数,可用属性来引用其元素
1 from collections import namedtuple 2 # namedtuple('名称', [属性list]): 3 Point = namedtuple('Point',['x','y']) 4 Circle = namedtuple('Circle',['x','y','r']) 5 p = Point(1,2) 6 c = Circle(1,2,3) 7 print(p.x) 8 print(c.r) 9 10 输出: 11 1 12 3
- deque:高效实现插入 append 和删除 pop 操作的双向列表,适合用于队列和栈。( list 是线性存储,数据量大的时候,插入和删除效率很低。)
1 from collections import deque 2 l = deque(['a','b','c']) 3 l.append('x') 4 l.appendleft(0) 5 # l.pop() #默认删除最后一个 6 print(l) 7 8 输出: 9 deque([0, 'a', 'b', 'c', 'x'])
- defaultdict:接受一个工厂函数作为参数,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值
dict =defaultdict( factory_function)
factory_function 可以是list、set、str等,当 key 不存在时,返回工厂函数的默认值,如 list 对应 [ ] , str 对应 空字符串 , set 对应 set( ) , int 对应 0等
1 from collections import defaultdict 2 s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)] 3 # d = {} 4 # for k,v in s: 5 # d.setdefault(k,[]).append(v) 6 d = defaultdict(list) 7 for k,v in s: 8 d[k].append(v) 9 print(sorted(d.items())) 10 11 dic = defaultdict(lambda :'x') 12 print(dic['key']) 13 14 输出: 15 [('blue', [2, 4, 4]), ('red', [1, 3, 1])] 16 x
- OrderedDict:保持 Key 的顺序,使用 dict 时, Key 是无序的。 OrderedDict 的 Key 会按照插入的顺序排列,不是 Key 本身排序:
1 from collections import OrderedDict 2 d = OrderedDict([('a',1),('b',2),('c',3)]) 3 print(d['a']
- ChainMap:把一组 dict 串起来并组成一个逻辑上的 dict 。 ChainMap 本身也是一个 dict ,查找的时候,会按照顺序在内部的dict依次查找,用户指定的命令行参数优先于环境变量的示例,而环境变量优先于默认值(参照:python官网文档解析)
1 from collections import ChainMap 2 import os,argparse 3 4 default = {'color':'red','user':'guest'} 5 parser = argparse.ArgumentParser() 6 parser.add_argument('-u','--user') 7 parser.add_argument('-c','--color') 8 namespace = parser.parse_args() 9 command_line_args = {k:v for k, v in vars(namespace).items() if v} 10 combined = ChainMap(command_line_args,os.environ,default) 11 print(combined['color']) 12 print(combined['user']) 13 14 输出: 15 red 16 guest
- Counter:计算器,统计字符出现的个数
1 from collections import Counter 2 c = Counter() 3 for ch in 'programming': 4 c[ch] = c[ch] + 1 5 print(c) 6 7 输出: 8 Counter({'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})
base64:用64个字符来表示任意二进制数据的方法(二进制编码方法),要编码的二进制数据不是3的倍数时,在编码的末尾加上1个或2个=
号,表示补了多少字节,解码的时候,会自动去掉
1 import base64 2 print(base64.b64encode(b'binary\x00string')) 3 print(base64.b64decode(b'YmluYXJ5AHN0cmluZw==')) 4 5 输出: 6 b'YmluYXJ5AHN0cmluZw==' 7 b'binary\x00string'
标准的Base64编码后可能出现字符+
和/
,在URL中就不能直接作为参数,使用urlsafe 把字符+
和/
分别变成-
和_:
1 import base64 2 print(base64.b64encode(b'i\xb7\x1d\xfb\xef\xff')) 3 print(base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')) 4 5 输出: 6 b'abcd++//' 7 b'abcd--__'
1 import base64 2 #去掉‘=’号的base64解码函数 3 def safe_base64_decode(s): 4 num = len(s) % 4 5 if num != 0: 6 for x in range(0, num): 7 s += b"=" 8 return base64.b64decode(s) 9 assert b'abcd' == safe_base64_decode(b'YWJjZA=='), safe_base64_decode('YWJjZA==') 10 assert b'abcd' == safe_base64_decode(b'YWJjZA'), safe_base64_decode('YWJjZA') 11 print('ok') 12 13 输出: 14 ok
struct:解决 bytes 和其他二进制数据类型的转换, pack 函数第一个参数是处理指令: >I 表字节顺序是big-endian,也就是网络序, I表示4字节无符号整数; >IH 表示 I 4字节无符号整数和 H 2字节无符号整数;
1 import struct 2 print(struct.pack('>I', 10240099)) 3 print(struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80')) 4 5 输出: 6 b'\x00\x9c@c' 7 (4042322160, 32896)