十一、常用内建模块

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

 转换字符串的时间

 1 from datetime import datetime
 2 
 3 # 将当前时间转换为时间戳
 4 local_time = datetime.now().timestamp()
 5 print(local_time)
 6 
 7 # 输出
 8 1610521987.994504
 9 
10 # 转换字符串为时间格式
11 t = datetime.strptime('2021-1-10T10:10:10.789+08:00', '%Y-%m-%dT%H:%M:%S.%f%z')
12 print(t)
13 
14 # 输出
15 2021-01-10 10:10:10.789000+08:00
16 
17 # 将字符串转为时间戳,需先转为时间格式
18 d_time = datetime.strptime('2021-1-10T10:10:10+00:00', '%Y-%m-%dT%H:%M:%S%z')
19 local_time = d_time.timestamp()
20 print(local_time)
21 
22 # 输出
23 1610244610.0
24 
25 # 将时间戳转换为字符串
26 s_time = datetime.fromtimestamp(1610244610.0)
27 local_time = s_time.strftime('%Y-%m-%dT%H:%M:%S%z')
28 print(local_time)
29 
30 # 输出
31 2021-01-10T10:10:10

 

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)

(hashlib、hmac、itertools、contextlib、urllib、XML、HTMLParser   --> 后续模块参考 ==> 廖雪峰的python教程

posted @ 2019-01-03 16:06  F·灬小人物  阅读(183)  评论(0编辑  收藏  举报