python周结

本周内容总结

1.正则表达式

1.1正则表达式之字符组

'''字符组默认匹配方式是挨个挨个匹配'''
[0123456789]		匹配0到9任意一个数(全写)
[0-9]			   匹配0到9任意一个数(缩写)
[a-z]		      匹配26个小写英文字母
[A-Z]			   匹配26个大写英文字母
[0-9a-zA-Z]			匹配数字或者小写字母或者大写字母
ps:字符组内所有的数据默认都是或的关系

1.2正则表达式之量词

'''正则表达式默认情况下都是贪婪匹配>>>:尽可能多的匹'''
* 		匹配零次或多次   默认是多次(无穷次)
+		匹配一次或多次   默认是多次(无穷次)
?		匹配零次或一次	  作为量词意义不大主要用于非贪婪匹配
{n}		重复n次
{n,}	重复n次或更多次	默认是多次(无穷次)
{n,m}	重复n到m次		  默认是m次
ps:量词必须结合表达式一起使用 不能单独出现 并且只影响左边第一个表达式
    jason\d{3} 只影响\d

1.3正则表达式之特殊符号

'''特殊符号默认匹配方式是挨个挨个匹配'''
.			匹配除换行符以外的任意字符
\w			匹配数字、字母、下划线
\W			匹配非数字、非字母、非下划线
\d			匹配数字
^			匹配字符串的开头
$			匹配字符串的结尾
		两者组合使用可以非常精确的限制匹配的内容
a|b			匹配a或者b(管道符的意思是或)
()			给正则表达式分组 不影响表达式的匹配功能
[]			字符组 内部填写的内容默认都是或的关系
[^]			取反操作 匹配除了字符组里面的其他所有字符
		注意上尖号在中括号内和中括号意思完全不同

1.4正则表达式之贪婪与非贪婪匹配

"""所有的量词都是贪婪匹配如果想要变为非贪婪匹配只需要在量词后面加问号"""
待匹配的文本
	<script>alert(123)</script>
待使用的正则(贪婪匹配)
	<.*>
请问匹配的内容
	<script>alert(123)</script> 一条
# .*属于典型的贪婪匹配 使用它 结束条件一般在左右明确指定
待使用的正则(非贪婪匹配)
	<.*?>

1.5转义符

"""斜杠与字母的组合有时候有特殊含义"""
\n     	   匹配的是换行符
\\n			匹配的是文本\n
\\\\n		匹配的是文本\\n
ps:如果是在python中使用 还可以在字符串前面加r取消转义

2.py第三方模块

2.1第三方模块的下载与使用

第三方模块:别人写的模块 一般情况下功能都特别强大
    
我们如果想使用第三方模块 第一次必须先下载后面才可以反复使用(等同于内置模块)

下载第三方模块的方式
	1.pip工具
    	注意每个解释器都有pip工具 如果我们的电脑上有多个版本的解释器那么我们在使用pip的时候一定要注意到底用的是哪一个 否则极其任意出现使用的是A版本解释器然后用B版本的pip下载模块
       为了避免pip冲突 我们在使用的时候可以添加对应的版本号
    	   python27			 pip2.7
     	  python36			pip3.6
         python38			pip3.8
  		下载第三方模块的句式
        	pip install 模块名
       下载第三方模块临时切换仓库
    		 pip install 模块名 -i 仓库地址
       下载第三方模块指定版本(不指定默认是最新版)
    		 pip install 模块名==版本号 -i 仓库地址
 	2.pycharm提供快捷方式
    	群内截图
      	
"""
下载第三方模块可能会出现的问题
	1.报错并有警告信息
		WARNING: You are using pip version 20.2.1;
		原因在于pip版本过低 只需要拷贝后面的命令执行更新操作即可
		d:\python38\python.exe -m pip install --upgrade pip
		更新完成后再次执行下载第三方模块的命令即可
	2.报错并含有Timeout关键字
		说明当前计算机网络不稳定 只需要换网或者重新执行几次即可
	3.报错并没有关键字
		面向百度搜索
			pip下载XXX报错:拷贝错误信息
		通常都是需要用户提前准备好一些环境才可以顺利下载
	4.下载速度很慢
		pip默认下载的仓库地址是国外的 python.org
		我们可以切换下载的地址
		pip install 模块名 -i 仓库地址
		pip的仓库地址有很多 百度查询即可
		清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/
		阿里云:http://mirrors.aliyun.com/pypi/simple/
		中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/
		华中科技大学:http://pypi.hustunique.com/
		豆瓣源:http://pypi.douban.com/simple/
		腾讯源:http://mirrors.cloud.tencent.com/pypi/simple
		华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/
"""

2.2python正则模块之re

在python中如果想要使用正则 可以考虑re模块

import re

常见操作方法
res = re.findall('a', 'jason apple eva')
print(res)  # 查找所有符合正则表达式要求的数据 结果直接是一个列表
res = re.finditer('a', 'jason apple eva')
print(res)
res = re.search('a', 'jason apple eva')
print(res)  # <re.Match object; span=(1, 2), match='a'>
print(res.group())  # a  匹配到一个符合条件的数据就立刻结束
res = re.match('a', 'jason apple eva')
print(res)  # None  匹配字符串的开头 如果不符合后面不用看了
print(res.group())  # 匹配开头符合条件的数据 一个就结束
obj = re.compile('\d{3}')  # 当某一个正则表达式需要频繁使用的时候 我们可以做成模板
res1 = obj.findall('23423422342342344')
res2 = obj.findall('asjdkasjdk32423')
print(res1, res2)


ret = re.split('[ab]', 'abcd')  # 先按'a'分割得到''和'bcd',再对''和'bcd'分别按'b'分割
print(ret)  # ['', '', 'cd']

ret = re.sub('\d', 'H', 'eva3jason4yuan4', 1)  # 将数字替换成'H',参数1表示只替换1个
print(ret)  # evaHjason4yuan4

ret = re.subn('\d', 'H', 'eva3jason4yuan4')  # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)  # ('evaHjasonHyuanH', 3)


1.分组优先
	 # res = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    # print(res)  # ['oldboy']
    # findall分组优先展示:优先展示括号内正则表达式匹配到的内容
    # res = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
    # print(res)  # ['www.oldboy.com']

    # res = re.search('www.(baidu|oldboy).com', 'www.oldboy.com')
    # print(res.group())  # www.oldboy.com
    # res = re.match('www.(baidu|oldboy).com', 'www.oldboy.com')
    # print(res.group())  # www.oldboy.com
    
2.分组别名
    res = re.search('www.(?P<content>baidu|oldboy)(?P<hei>.com)', 'www.oldboy.com')
    print(res.group())  # www.oldboy.com
    print(res.group('content'))  # oldboy
    print(res.group(0))  # www.oldboy.com
    print(res.group(1))  # oldboy
    print(res.group(2))  # .com
    print(res.group('hei'))  # .com

2.3网络爬虫模块之requests模块

requests模块能够模拟浏览器发送网络请求

import requests

1.朝指定网址发送请求获取页面数据(等价于:浏览器地址栏输入网址回车访问)
res = requests.get('http://www.redbull.com.cn/about/branch')
print(res.content)  # 获取bytes类型的网页数据(二进制)
res.encoding = 'utf8'  # 指定字符编码
print(res.text)  # 获取字符串类型的网页数据(默认按照utf8)

2.4自动化办公领域之openpyxl模块

1.excel文件的后缀名问题
	03版本之前
    	.xls
     03版本之后
    	.xlsx
2.操作excel表格的第三方模块
	xlwt往表格中写入数据、wlrd从表格中读取数据
    	兼容所有版本的excel文件
 	openpyxl最近几年比较火热的操作excel表格的模块
    	03版本之前的兼容性较差
	ps:还有很多操作excel表格的模块 甚至涵盖了上述的模块>>>:pandas
            
3.openpyxl操作
	'''学会看官方文档!!!'''
    3.openpyxl操作
	'''学会看官方文档!!!'''
    from openpyxl import Workbook
    # 创建一个excel文件
    wb = Workbook()
    # 在一个excel文件内创建多个工作簿
    wb1 = wb.create_sheet('学生名单')
    wb2 = wb.create_sheet('舔狗名单')
    wb3 = wb.create_sheet('海王名单')
    # 还可以修改默认的工作簿位置
    wb4 = wb.create_sheet('富婆名单', 0)
    # 还可以二次修改工作簿名称
    wb4.title = '高富帅名单'
    wb4.sheet_properties.tabColor = "1072BA"

    # 填写数据的方式1
    # wb4['F4'] = 666
    # 填写数据的方式2
    # wb4.cell(row=3, column=1, value='jason')
    # 填写数据的方式3
    wb4.append(['编号', '姓名', '年龄', '爱好'])  # 表头字段
    wb4.append([1, 'jason', 18, 'read'])
    wb4.append([2, 'kevin', 28, 'music'])
    wb4.append([3, 'tony', 58, 'play'])
    wb4.append([4, 'oscar', 38, 'ball'])
    wb4.append([5, 'jerry', 'ball'])
    wb4.append([6, 'tom', 88,'ball','哈哈哈'])

    # 填写数学公式
    # wb4.cell(row=1, column=1, value=12321)
    # wb4.cell(row=2, column=1, value=3424)
    # wb4.cell(row=3, column=1, value=23423432)
    # wb4.cell(row=4, column=1, value=2332)
    # wb4['A5'] = '=sum(A1:A4)'
    # wb4.cell(row=8, column=3, value='=sum(A1:A4)')


    # 保存该excel文件
    wb.save(r'111.xlsx')
"""
openpyxl主要用于数据的写入 至于后续的表单操作它并不是很擅长 如果想做需要更高级的模块pandas    
import pandas

data_dict = {
    "公司名称": comp_title_list,
    "公司地址": comp_address_list,
    "公司邮编": comp_email_list,
    "公司电话": comp_phone_list
}
# 将字典转换成pandas里面的DataFrame数据结构
df = pandas.DataFrame(data_dict)
# 直接保存成excel文件
df.to_excel(r'pd_comp_info.xlsx')



excel软件正常可以打开操作的数据集在10万左右 一旦数据集过大 软件操作几乎无效
需要使用代码操作>>>:pandas模块
"""        

2.5hashlib加密模块

1.何为加密
	将明文数据处理成密文数据 让人无法看懂
2.为什么加密
	保证数据的安全
3.如何判断数据是否是加密的
	一串没有规律的字符串(数字、字母、符号)
4.密文的长短有何讲究
	密文越长表示使用的加密算法(数据的处理过程)越复杂
5.常见的加密算法有哪些
	md5、base64、hmac、sha系列
6.加密算法基本操作
	import hashlib
    # 1.选择加密算法
    md5 = hashlib.md5()
    # 2.传入明文数据
    md5.updata(b'holle')
    # 3.获取加密密文
    res = md5.hexdigest()
    print(res)  # 5d41402abc4b2a76b9719d911017c592

2.6subprocess模块

模拟操作系统终端 执行命令并获取结果
import subprocess

res = subprocess.Popen(
	'asdas', # 操作系统要执行的命令
    shell=True, # 固定配置
    stdin=subprocess.PIPE,  # 输入命令
    stdout=subprocess.PIPE,  # 输出结果
)
print('正确结果', res.stdout.read().decode('gbk'))  # 获取操作系统执行命令之后的正确结果
print('错误结果', res.stderr)  # 获取操作系统执行命令之后的错误结果

2.7logging日志模块

1.产生日志
2.过滤日志
	基本不用 因为在日志产生阶段就可以控制想要的日志内容 
3.输出日志
4.日志格式


import logging

# 1.日志的产生(准备原材料)        logger对象
logger = logging.getLogger('购物车记录')
# 2.日志的过滤(剔除不良品)        filter对象>>>:可以忽略 不用使用
# 3.日志的产出(成品)             handler对象
hd1 = logging.FileHandler('a1.log', encoding='utf-8')  # 输出到文件中
hd2 = logging.FileHandler('a2.log', encoding='utf-8')  # 输出到文件中
hd3 = logging.StreamHandler()  # 输出到终端
# 4.日志的格式(包装)             format对象
fm1 = logging.Formatter(
        fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S %p',
)
fm2 = logging.Formatter(
        fmt='%(asctime)s - %(name)s:  %(message)s',
        datefmt='%Y-%m-%d',
)
# 5.给logger对象绑定handler对象
logger.addHandler(hd1)
logger.addHandler(hd2)
logger.addHandler(hd3)
# 6.给handler绑定formmate对象
hd1.setFormatter(fm1)
hd2.setFormatter(fm2)
hd3.setFormatter(fm1)
# 7.设置日志等级
logger.setLevel(10)  # debug
# 8.记录日志
logger.debug('写了半天 好累啊 好热啊')

2.8日志配置字典

import logging
import logging.config
# 定义日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'  # 其中name为getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
# 自定义文件路径
logfile_path = 'a3.log'
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},  # 过滤日志
    'handlers': {
        # 打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        # 打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        # logging.getLogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)传递
        },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
        # '购物车记录': {
        #     'handlers': ['default','console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
        #     'level': 'WARNING',
        #     'propagate': True,  # 向上(更高level的logger)传递
        # },  # 当键不存在的情况下 (key设为空字符串)默认都会使用该k:v配置
    },
}
logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
# logger1 = logging.getLogger('购物车记录')
# logger1.warning('尊敬的VIP客户 晚上好 您又来啦')
# logger1 = logging.getLogger('注册记录')
# logger1.debug('jason注册成功')
logger1 = logging.getLogger('红浪漫顾客消费记录')
logger1.debug('慢男 猛男 骚男')
posted @ 2022-10-30 16:47  理塘丁真1!5!  阅读(23)  评论(0编辑  收藏  举报