day_17 上节课回顾 os模块 sys模块 json模块 pickle模块 logging模块 今日所学 包 time模块 datetime模块 random模块 hashlib模块和hmac模块 typing模块 requests模块 re模块

os模块

与操作系统交互

sys模块

与python解释器交互

json模块

跨平台数据交互,json串

pickle模块

存储python所有类型的数据,为了python文件和python文件的交互

logging模块

日志记录

今日所学

  1. 包 == 模块,包也是拿来导入用的
  2. 包是含有__init__.py的文件夹;导包就是导入__init__
  3. 包一定是被当做模块文件导入,模块文件m1.py/m2.py的搜索路径以执行文件的路径为准

time模块

提供了三种不同类型的时间(最主要为时间戳),三种不同类型的时间可以互相转换

# 时间戳形式
print(time.time()) 
# 格式化时间
print(time.strftime('%Y-%m-%d %X'))
# 结构化时间
print(time.localtime())

time.sleep() 让程序睡觉几秒

datetime模块

时间的加减

import datetime

now = datetime.datetime.now()
print(now)

# 默认3天
print(now + datetime.timedelta(3))
# 加3周
print(now + datetime.timedelta(weeks=3))
# 加3小时
print(now + datetime.timedelta(hours=3))
# 减3小时
print(now - datetime.timedelta(hours=3))

random模块

随机数

random.random()

0-1的数

random.randint(1,3)

1-3的整数

lt=[1,2,3]
random.shuffle(lt)# 打乱列表
random.choice(lt)# 随机选择一个

random.seed()

只随机一次

hashlib模块和hmac模块

hashlib模块

加密

m = hashlib.md5()
m.update(b'hello')
m.update(b'hello')
print(m.hexdigest())


m = hashlib.md5()
m.update(b'hellohello')
print(m.hexdigest())
  1. 结果永远都是相同长度的字符串
  2. 叠加性

hmac模块

加密, 加盐处理

m = hmac.new(b'123')
m.update(b'hellow')
print(m.hexdigest())

typing模块

与函数联用,控制函数参数的数据类型,提供了基础数据类型之外的数据类型

requests模块

一般用于爬虫,用来爬取数据,模拟浏览器对url发送请求拿到数据

#用法
import requests
res=requests.get(url)
data=res.text
print(data)

re模块

去字符串找符合某种特点的字符串

#查找所有
findall
# ^:以...开头
res = re.findall('^ab', s)
print(res)
res = re.findall('^bc', s)
print(res)
# $: 以..结尾
s = 'abcdabc'
res = re.findall('bc$', s)
print(res)

# .: 任意字符
s = 'abc红abc'
res = re.findall('abc.', s)
print(res)

# d: 数字
s = 'skld2342ljk'
res = re.findall('d', s)
print(res)

# w: 非空,数字字母下划线
s = 'skld_23 42ljk'
res = re.findall('w', s)
print(res)

# s:空,空格/	/

s = 'skld_23 42ljk'
res = re.findall('s', s)
print(res)

# D: 非数字
s = 'skld2342ljk'
res = re.findall('D', s)
print(res)

# W: 空
s = 'skld_23 42ljk'
res = re.findall('W', s)
print(res)

# S:非空
s = 'skld_23 42ljk'
res = re.findall('S', s)
print(res)

# +: 前面的一个字符至少1个
s = 'abcddddd abcd abc'
print(re.findall('abcd+', s))

# ?:前面的一个字符0-1个
s = 'abcddddd abcd abc'
print(re.findall('abcd?', s))

# *:前面的一个字符至少0个
s = 'abcdddddddddddddddddd abcd abc'
print(re.findall('abcd*', s))

# []: 中括号内的都可以
s = 'abc bbc cbc dbc'
print(re.findall('[abc]bc', s))

# [^]: 中括号的都不可以
s = 'abc bbc cbc dbc'
print(re.findall('[^abc]bc', s))

# |:或
s = 'abc bbc dbc'
print(re.findall('abc|bbc', s))

# {2}:前面的字符2个

s = 'abccabc abccc'
print(re.findall('abc{2}', s))

# {1,2}:前面的字符2个

s = 'abccabc abccc'
print(re.findall('abc{1,2}', s))

# 贪婪模式
总是尝试匹配尽可能多的字符
# .(任意字符)*(0-无穷个)

s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg'
print(re.findall('a.*g', s))

# 非贪婪模式(*******)
总是尝试匹配尽可能少的字符
# .(任意字符)*(0-无穷个)?(让他进入非贪婪模式)
s = 'abcdefgbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbg'
print(re.findall('a.*?g', s))


# 匹配邮箱:
s = '#@#@#@nickchen121@163.com$$$$////nick@qq.com$$#$#$[]]2287273393@162.com@$2423423lksdlfj#'
# w(字母/数字/下划线)+(0-无穷个)@ w(字母/数字/下划线)+(0-无穷个).com
print(re.findall('w+@w+.com', s))


## match:  从开头找一个,找得到就不找了 ;找不到报错 --》
s = 'ab abcddd abc'
res = re.match('abcd*', s)
print(res.group())

## search: 从字符串找一个,就不找了
s = 'ab abcddd abc'
res = re.search('abcd*', s)
print(res.group())

## split 拼接
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.split('d+', s))

## sub == replace 替换
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.sub('d+', ' ', s))

## subn --> 替换了多少次
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.subn('d+', ' ', s))

## 修饰符 --> re.S会让.匹配换行符(*****)
s = '''abc
abcabc*abc
'''

# .不匹配换行
print(re.findall('abc.abc', s))  # ['abc*abc']
print(re.findall('abc.abc', s, re.S))  # ['abc
abc', 'abc*abc']
#

## 分组 --> 只要括号里的(*****)
s = 'abc abcd abcdd'
print(re.findall('a(.)c(d)', s))#[('b', 'd'), ('b', 'd')]

## 有名分组(了解)
s = 'abc abcd abcdd'
print(re.search('a(?P<name>.)c(?P<name2>d)', s).groupdict())