Python编程——常用内建模块

datatime

timestamp时间戳为当前时间相对于epoch time的秒数

from datetime import datetime
​
now = datetime.now() # 获取当前时间,如 2021-03-02 11:05:39.725109
dt = datetime(2021, 3, 2, 11, 5) # 创建指定时间
​
timestamp = dt.timestamp() # datetime转换为timestamp
dt = datetime.fromtimestamp(timestamp) # timestamp转换为当前系统时区的datetime
datetime.strptime('2021-03-02 11:05:39', '%Y-%m-%d %H:%M:%S') # str转datetime
datetime.now().strftime('%Y-%m-%d %H:%M:%S') #datetime转str
​
from datetime import timedelta
now + timedelta(days=2, hours=12) # 增加时间

时间转格式符

%a 英文星期简写
%A 英文星期的完全
%b 英文月份的简写
%B 英文月份的完全
%c 显示本地日期时间
%d 日期,取1-31
%H 小时, 0-23
%I 小时, 0-12
%m 月, 01 -12
%M 分钟,1-59
%j 年中当天的天数
%w 显示今天是星期几
%W 第几周
%x 当天日期
%X 本地的当天时间
%y 年份 00-99间
%Y 年份的完整拼写

collections

namedtuple

可命名元组,创建自定义tuple对象,并规定tuple元素个数,并可以用索引进行引用。

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
p.x

deque

双向列表,适合用于队列和栈

from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x') # pop
q.appendleft('y') # popleft
q.clear() # 清空队列元素

defaultdict

默认字典,当key不存在时,能返回默认值

from collections import defaultdict
dict = defaultdict(factory_function)
# factory_function可以是list、set、str、int等等,作用是当key不存在时,返回factory_function的默认值
# list对应[ ],str对应的是'',set对应set( ),int对应0
dict = defaultdict(int) # 当key不存在时,默认返回0

OrderedDict

有序字典,保持key的顺序,按插入顺序排序

Counter

计数器,dict的子类,用来进行hashtable计数,将元素进行数量统计,计数后返回一个字典

from collections import Counter
c = Counter() # 创建空的Counter,或传入字符串、字典、元组、列表
c[key] # 获取key的计数
del c[key] # 删除元素
list(c.elements()) # 获得所有元素
c.most_common(k) # 最常见的k个元素

random

import random
random.random() # 返回随机生成的一个实数,它在[0,1)范围内
random.randint(0,9) # 返回随机数,范围在[0,9]
random.sample(range(low,high),N) # 表示从[low, high]区间随机生成N个数,结果以列表返回

base64

import base64
base64.b64encode(b'binary string')
base64.b64decode(b'YmluYXJ5IHN0cmluZw==')
​
# 标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数
base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff') #urlsafe_b64encode 把结果中字符+和/分别变成-和_
# 由 b'abcd++//' 变为 b'abcd--__'

Base64编码的长度永远是4的倍数,因此,需要加上=把Base64字符串的长度变为4的倍数,就可以正常解码了。

常用于在URL、Cookie、网页中传输少量二进制数据。

struct

来解决bytes和其他二进制数据类型的转换

https://www.liaoxuefeng.com/wiki/1016959663602400/1017685387246080

hashlib

import hashlib
​
md5 = hashlib.md5()
sha1 = hashlib.sha1()
​
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib?'.encode('utf-8')) # 如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的
print(md5.hexdigest())

md5 128bit 32位16进制字符串表示

sha1 160bit 40位16进制字符串表示

加盐:md5(message + salt)

hmac

实现带key的哈希(加盐)

import hmac
message = b'Hello, world!'
key = b'secret'
h = hmac.new(key, message, digestmod='MD5')
# 如果消息很长,可以多次调用h.update(msg)
h.hexdigest()

itertools

提供用于操作迭代对象的函数

import itertools
natuals = itertools.count(1) # 自然数序列迭代器 1, 2, 3, 4, 5,...
cs = itertools.cycle('ABC')  # 无限重复序列 'A','B','C','A','B',..
ns = itertools.repeat('A', 3) # 重复元素,不指定次数则无线重复
​
ns = itertools.takewhile(lambda x: x <= 10, natuals) # 截取有限序列
​
for c in itertools.chain('ABC', 'XYZ') # 串联一组迭代对象 'A','B','C','X','Y',..
for key, group in itertools.groupby('AAABBBCCAAA') # 相邻的重复元素挑出来放在一起
# A ['A', 'A', 'A']
# B ['B', 'B', 'B']
# C ['C', 'C']
# A ['A', 'A', 'A']
# 可以加入函数作为参数,只要作用于函数的两个元素返回的值相等就可以被归为一组

logging

参考资料:https://blog.csdn.net/pansaky/article/details/90710751

基本使用

import logging
logging.info('info') # 输出日志
logging.basicConfig(level=loggging.INFO) # 设置日志级别,只显示不低于设置级别的日志,默认为warning
​
# 级别排序 fatal > critical > error > warning > info > debug
​
# basicConfig参数设置
format 设置输出的格式
    %(levelno)s:打印日志级别的数值
    %(levelname)s:打印日志级别的名称
    %(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
    %(filename)s:打印当前执行程序名
    %(funcName)s:打印日志的当前函数
    %(lineno)d:打印日志的当前行号
    %(asctime)s:打印日志的时间
    %(thread)d:打印线程ID
    %(threadName)s:打印线程名称
    %(process)d:打印进程ID
    %(message)s:打印日志信息
filename 指定日志文件名
filemode 'w'或'a'

日志写入文件 — 使用handler

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO) # 创建logger
handler = logging.FileHandler('./log.txt','w') # 创建handler
handler.setLevel(logging.INFO) # 级别不能比logger小,否则没有日志
handler.setFormatter(logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")) # 定义输出格式
logger.addHandler(handler)

发表评论