目录
包
包的特征
1.包是含有__init__
的文件夹,导包就是导入__init__
2.包一定是被当作模块文件导入,模块文件的搜索路径以执行文件路径为基准
相对导入与绝对导入
绝对导入
以包的根目录为基准
相对导入
以当前被导入的模块所在的目录为基准
.
表示当前文件夹下的文件
..
表示父文件夹下的文件
...
表示爷爷文件夹下的文件
两种导入都只能在包的内部使用
包的作用
在扩展模块功能的时候,把多个模块文件放入一个包(文件夹)内,但不改变模块的导入方式,类似于函数的装饰器
time模块和datetime模块
import time
#time模块:与时间相关
#1.time.time()---返回当前时间戳,从1970年1月1日00:00:00开始计算
#2.格式化时间
print(time.strftime('%Y-%m-%d %H:%M:%S'))
print(time.strftime('%Y-%m-%d %X'))
print(time.strftime('%x %X'))
#3.结构化时间
print(time.localtime()) #列出时间的九个元素,年/月/日/时/分/秒/一周中第几天(周日始)/一年中第几天/是否夏令时
import datetime
#datetime模块:时间加减
now = datetime.datetime.now()
print(now) #秒精确到小数点后六位
#时间加减
print(now + datetime.timedelta(3)) #加三天
print(now + datetime.timedelta(weeks = 3)) #加三周
print(now + datetime.timedelta(hours = 3)) #加三小时
#时间替换
print(now.replace(1949,10,1,10,1,10,0))
random模块
import random
#random模块:随机数
# random.seed(10)
#常用
print(random.random()) #随机(0-1)之间浮点数
print(random.randint(1,3)) #随机[1-3]之间整数
print(random.randrange(5)) #随机[0,5)的整数
lt = [1,2,3]
random.shuffle(lt) #将列表随机洗牌
print(lt)
print(random.choice(lt)) #从可迭代对象中随机选择一个
#随机数种子,控制只随机一次
# random.seed(10)
print(random.random())
random.seed(time.time()) #梅森旋转算法
print(random.random())
print(random.sample(lt,2)) #抽样
hashlib模块和hmac模块
#hashlib模块
import hashlib
m = hashlib.md5()
m.update(b's')
m.update(b'b')
print(m.hexdigest()) #26148d621ef74844918af182d63976b6
m = hashlib.md5()
m.update(b'sb')
print(m.hexdigest()) #26148d621ef74844918af182d63976b6
#可叠加性:多次update不同内容与直接一次update总内容结果一致
#破解hashlib加密
#1.列出用户常用密码表
#2.通过遍历得到常用密码对应哈希结果
#3.比对拦截包的哈希值得到正确密码
pwd_list = ['abc','123','456','sb']
hash_pwd = '26148d621ef74844918af182d63976b6'
for pwd in pwd_list:
m = hashlib.md5()
m.update(pwd.encode('utf8'))
res = m.hexdigest ()
if res == hash_pwd:
print('密码为:',pwd)
#hmac模块:秘钥(salt)
import hmac
m = hmac.new(b'maerzi')
m.update(b'caiqilong')
print(m.hexdigest()) #95e4cf14b46c797c40da2b090a67b5b9
m = hmac.new(b'mababa')
m.update(b'caiqilong')
print(m.hexdigest()) #7aab304fa2a10b67d4f480ae4c9e07a2
#相同的密码,密钥不同的到的hmac结果不同
typing模块
与函数联用,控制函数参数的数据类型,提供基础之外的数据类型
from typing import Iterable, Iterator
def f(x: Iterator, y: Iterable) -> list:
pass
requests模块re模块
requests 模块
#requests模块:爬虫-->爬数据,模拟浏览器对url发送请求,拿到数据
#url:同一资源定位符,永不重复
import requests
response = requests.get('https://www.cnblogs.com/nickchen121/')
data = response.text
# print(data)
#正则re:从大的字符串中挑选出具有某种形状特点的字符串,结果以列表方式存储
import re
res_title = re.findall('<a class="postTitle2" .*?>(.*?)</a>',data,re.S)
# print(res_title)
res_digest = re.findall('<div class="c_b_p_desc">(.*?)<a href="https://.*?" class="c_b_p_desc_readmore">',data,re.S)
# print(res_digest)
l = len(res_digest)
for i in range(l):
print(res_title[i].strip()+'\n'+res_digest[i].strip()+'\n'+'*'*175)
正则表达式
#正则表达式
import re
#1. "^..." 表示以...字符开头, "^" 自己本身不占字符位置
s = '''abcabc1
23'''
res = re.findall('^abc',s)
print(res)
res = re.findall('abc',s)
print(res)
res = re.findall('\^abc',s) # "\" 表示转义字符使 "\" 后的字符转义
print(res)
#2. "...$" 表示以..字符结尾, "$" 自己本身不占字符位置
res = re.findall('bc$',s)
print(res)
res = re.findall('bc',s)
print(res)
#3. "." 表示匹配一个字符,该字符除了"\n"外均可
res = re.findall('a.c.',s)
print(res)
#4. "\w" 表示匹配一个单词字符,该字符属于字母数字下划线 "[A-Z,a-z,0-9,'_']"
res = re.findall('\w',s)
print(res)
#5. "\W" 表示匹配一个单词字符,该字符不属于字母数字下划线 "[A-Z,a-z,0-9,'_']"
res = re.findall('1\W\W\W2',s)
print(res)
#6. "\d" 表示表示匹配一个数字字符
res = re.findall('\d\d',s)
print(res)
#7. "\D" 表示匹配一个非数字字符
res = re.findall('\D',s)
print(res)
#8. "\s" 等价于 "\W"
res = re.findall('\s',s)
print(res)
#9. "\S" 等价于 "\w"
res = re.findall('\S',s)
print(res)
#10. "+" 表示匹配 "+" 前面一个字符 "[1,+∞)" 次,从 "+∞" 到 "1" , "+" 自己本身不占字符位置
res = re.findall('abcd+','abcddddd abcd abc')
print(res)
#11. "?" 表示匹配 "?" 前面一个字符 "[0,1]" 次,从 "1" 到 "0" , "?" 自己本身不占字符位置
res = re.findall('abcd?','abcddddd abcd abc')
print(res)
#12. "*" 表示匹配 "*" 前面一个字符 "[0,+∞)" 次,从 "+∞" 到 "0" , "*" 自己本身不占字符位置
res = re.findall('abcd*','abcddddd abcd abc')
print(res)
#13. "[]" 表示匹配 "[]" 中的字符串中的某一个字符, "[]" 自己本身占一个字符位置
res = re.findall('[abc]b','abcbbccbcdbc')
print(res)
#14. "[^]" 表示 "[^]" 中的字符串中的任意一个字符都不能匹配, "[^]" 自己本身占一个字符位置
res = re.findall('[^abc]bc','abcbbccbc bc')
print(res)
#15. "|" 表示匹配 "|" 左边的字符串或者匹配 "|" 右边的字符串
res = re.findall('bbc|abc','abcbbcdbc')
print(res)
#16. "{m,n}" 表示匹配 "{m,n}" 前面一个字符 "[m,n]" 次, "{m,n}" 自己本身不占字符位置, "{}" 内只有一个数表示匹配前一个字符确定的次数
res = re.findall('abc{1,2}','abccabcabccc')
print(res)
贪婪模式非贪婪模式
import re
#贪婪模式(最大跨度): ".*" , 其中 ".":任意字符 , "*":"[0,+∞)"个
s = 'bacdefgaaaaaaaaaaaag'
print(re.findall('a.*g',s))
#非贪婪模式(最小跨度): ".*?" , 其中 ".":任意字符, "*":"[0,+∞)"个, "?":进入非贪婪模式
print(re.findall('a.*?g',s))
特殊构造(仅了解)
#特殊构造(仅了解)
# "a(?=\d)" 表示 "a" 后面是数字但不要数字,不消耗 "\d" 内容
s = 'a123 aaaa a234 abc'
print(re.findall('a(?=\d)',s))
print(re.findall('a(?=\w)',s))
#匹配邮箱练习
s = '#@#@#@nickchen121@163.com$$$$////nick@qq.cn$$#$#$[]]2287273393@162.com@$2423@423lksdlf@j#'
res = re.findall('\w+@\w+\.\w+',s) # "\w" :字母/数字/下划线
print(res)
re模块中常用函数
import re
# re模块中常用的函数( "findall" 之外)
#1. re.compile
s = 'abcd abcddd abc'
res = re.compile('abcd*')
print(res)
print(re.findall(res,s))
#实际用途
email_pattern = re.compile('\w+@\w+\.\w+')
phione_pattern = re.compile('\d{13}')
# 接下来两个面试非常重要
#2. re.match---匹配到一个之后就不再匹配,必须以以该字符串开头
s = 'abcd abcddd abc'
res = re.match('abcd*',s)
print(res)
print(res.group())
#3. re.search---匹配到一个之后就不再匹配,可以不以该字符串开头
res = re.search('abcd*',s)
print(res)
print(res.group())
#4. re.split---以写的正则表达式划分
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.split('\d+',s))
#5. re.sub == replace 将写的正则表达式替换成指定字符
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.sub('\d+','',s))
#6. re.subn 比 re.sub 多输出替换次数
s = 'ab23423abcddd234234abcasdfjlasjdk234l23lk4j2kl34kl25k3j2kl3j5lkj'
print(re.subn('\d+','',s))
补充
import re
#7.补充
#修饰符
# re.S---非常有用
s = '''abc
abcabc*abc
'''
print(re.findall('abc.abc',s)) # "." 不匹配换行符
print(re.findall('abc.abc',s,re.S)) # "re.s" 让 "." 能匹配换行符
#9. 分组(非常重要):"()"---提取括号内的内容,多个括号提取内容时一个符合的结果用一个元组存储
s = 'abc abcd amcdd'
print(re.findall('a(.)c(d)',s))
#有名分组(了解即可)---一般与 "re.search" 联用,给 "()" 提取的内容加上名字,以字典形式输出
s = 'abc abcd amcdd'
print(re.search('a(?P<name1>.)c(?P<name2>d)',s).groupdict())
#有名分组与 "re.sub" 联用, 匹配的字符串中 "()" 提取的有名内容保留,其他去除
s = 'abc123abc123'
print(re.sub('c\d+a',' ',s))
print(re.sub('c(?P<name>\d+)a',' \g<name> ',s))
总结
#重点需记忆内容
# 贪婪和非贪婪: ".*" / ".*?"
# re.findall
# re.S
# "re.match" 和 "re.search" 区别
# 分组: "()" ---有名分组: 给分组加名字