第六周学习笔记总结

今日内容概要

  • 购物车程序
  • 正则表达式
  • re模块
  • openpyxl模块
  • 第三方模块下载
  • random随机数模块
  • hashlib加密模块
  • subprocess模块
  • logging日志模块

今日内容详细

购物车程序

  • 购物车功能基础框架搭建

    1.空函数
    2.功能字典
    3.循环
    
  • 购物车功能之注册

    1.动态创建db文件夹
    2.获取用户数据
    3.拼接存储用户数据的文件路径
    4.判断文件路径是否存在
    5.如果存在则表示用户名已注册
    6.如果不存在构建用户字典(诸多键值对)
    7.json序列化到文件中
    
  • 购物车功能之登录

    1.获取用户数据
    2.拼接存储用户数据的文件路径
    3.判断文件路径是否存在
    4.如果存在则获取文件中用户的真实数据
    5.根据真实数据与用户输入的数据比对
    6.使用全局大字典记录用户的登录状态(用户名)
    7.如果不存在则提示错误信息
    
  • 购物车功能之校验用户身份

    1.装饰器模板
    2.根据全局大字典是否存储了用户名判断是否可执行被装饰函数
    
  • 购物车功能之添加购物车

    1.校验用户身份(装饰器自动完成)
    2.循环打印商品数据(枚举)
    3.获取用户输入的商品编号
    4.针对编号做一些比较小的完善处理(纯数字 范围)
    5.根据编号获取对应的商品数据
    6.获取用户购买的数量
    7.创建一个临时购物车字典存储用户想要购买的商品
    8.获取用户真实数据中的购物车
    9.判断购物车中是否已经含有商品数据
    10.如果有则采用自增的方式
    11.如果没有则采用新建键值对的方式
    12.将用户数据重新序列化到文件中
    """
    1.针对一些数据可以做注释    
    2.习惯使用打印操作 查看某些关键点
    """
    
  • 购物车功能之结算购物车

    1.通过登录的用户名获取用户数据
    2.获取购物车数据
    3.计算购物车中商品的总价
    4.判断总价是否小于用户账户余额
    5.如果小于或等于则完成扣款并清空购物车 最后重新写入
    6.如果大于则提示用户余额不够 并保持购物车数据不变
    

正则表达式

正则表达式线上测试网址: http://tool.chinaz.com/regex/

官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的

一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字

符串”用来表达对字符串的一种过滤逻辑。

主要用于数据的查找与筛选

  • 正则表达式之特殊符号
符号 匹配内容
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\W 匹配非字母或数字或下划线
\d 匹配数字
^ 匹配字符串的开头
$ 匹配字符串的结尾
a|b 匹配字符a或字符b
() 给正则表达式分组,不影响正则表达式的匹配
[] 匹配字符组中的字符
[^] 匹配除了字符组中字符的所有字符
\s 匹配任意的的空白符
\n 匹配换行符
\t 匹配制表符
\b 匹配一个单词的结尾
\D 匹配非数字
\S 匹配非空白符
  • 正则表达式之量词
量词 用法说明
* 重复零次或更多次(默认就是尽可能多)
+ 重复一次或更多次(默认就是尽可能多)
? 重复零次或一次(默认就是一次)
重复n次
重复n次或更多次
重复n到m次

re模块

方法 作用
findall 通过正则表达式筛选出文本中所有符合条件的数据
finditer 与findall作用一致,只不过结果会被处理成迭代器对象,用于节省内存
search 通过正则表达式匹配到一个符合条件的内容就结束
match 通过正则表达式从头开始匹配,如果开头就不符合,后面就不走了
compile 能够提前准备好正则,之后可以反复使用减少代码冗余
下面了解即可
fullmatch 要求目标文本要完全匹配规则,否则返回None
sub 将与规则匹配的字符串替换为其他文本
split 从与规则匹配的字符串进行切割,返回切割后字符串组成的列表
groups 用于查看指定分组匹配到的内容

openpyxl模块

1.打开文件

创建
from openpyxl import Workbook
# 实例化
wb = Workbook()
# 激活 worksheet
ws = wb.active

打开已有
from openpyxl import load_workbook
wb2 = load_workbook('文件名称.xlsx')

2.存储数据

方式一:数据可以直接分配到单元格中(可以输入公式)
ws['A1'] = 42
方式二:可以附加行,从第一列开始附加(从最下方空白处,最左开始)(可以输入多行)
ws.append([1, 2, 3])
方式三:Python 类型会被自动转换
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")

3.创建工作表

方式一:插入到最后(default)
ws1 = wb.create_sheet("Mysheet")
方式二:插入到最开始的位置
ws2 = wb.create_sheet("Mysheet", 0)

4.修改工作表的名称

ws.title = '舔狗表'  # 支持二次修改

5.查看表名

显示所有表名
print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']
遍历所有表
for sheet in wb:
print(sheet.title)

6.写入数据

方法一
c = ws['A4']
方法二:row 行;column 列
d = ws.cell(row=4, column=2, value=10)
方法三:只要访问就创建
for i in range(1,101):
for j in range(1,101):
ws.cell(row=i, column=j)
方法四:批量写入
ws.append(['username','password','age','gender','hobby'])
ws.append(['jason1',123,18,'male','read'])
ws.append(['jason2',123,18,'male','read'])
ws.append(['jason3',123,18,'male','read'])
ws.append(['jason4',123,18,'male','read'])
ws.append(['jason4',123,18,'male',None])
ws.append([None,123,18,'male',''])

7.保存数据

wb.save('文件名称.xlsx')

8.其他

计算B5到B10之间的和写在F11的位置
ws['F11'] = '=sum(B5:B10)'

改变 sheet 标签按钮颜色
ws.sheet_properties.tabColor = "1072BA"

获取最大行,最大列
print(sheet.max_row)
print(sheet.max_column)

删除工作表
方式一
wb.remove(sheet)
方式二
del wb[sheet]



# openpyxl读写数据使用的模块不一样
from openpyxl import Workbook, load_workbook


wb = load_workbook(r'111.xlsx',data_only=True) # 读取名为111.xlsx的文件

print(wb.sheetnames)  # 查看excel文件中所有的工作簿名称

wb1 = wb['红浪漫消费记录']  # 获取表红浪漫消费记录

print(wb1.max_row)  # 表的最大行数
print(wb1.max_column)  # 表的最大列数

# 方式一:
print(wb1['A1'].value)  # 位于A1位置的数据

# 方式二:
print(wb1.cell(row=2, column=2).value)  # 位于第二行第二列位置的数据

# 循环获取每一行的数据
for i in wb1.rows:
    print([j.value for j in i])  # ['username', 'gender', 'age']

# 循环获取每一列的数据
for j in wb1.columns:
    print([i.value for i in j])  # ['username', 'jason', 'kevin', 'tony', None]

第三方模块下载

1.第三方模块必须先下载才可以导入使用

2.python下载第三方模块需要借助于pip工具

3.下载命令

​ pip3.8 install 模块名

random随机数模块

方法 作用
random 返回0到1之间随机的小数
randint(a,b) 用于声场一个指定范围内的整数。其中,参数a是下限,b是上限,生成的随机数n:a<=n<=b
choice(seq) 从非空序列 seq 返回一个随机元素。 如果 seq 为空,则引发 IndexError
sample(seq,k) 从指定序列中随机获取K长度的片段。不会修改原有的序列
shuffle(x) 将序列 x 随机打乱位置

hashlib加密模块

  • 常见加密算法

md5 sha系列 hmac base64

import hashlib
md5 = hashlib.md5()  # 选择md5加密算法作为数据的加密策略
md5.update(b'123')  # 往里面添加明文数据 数据必须是bytes类型
res = md5.hexdigest()  # 获取加密之后的结果
print(res)  # 202cb962ac59075b964b07152d234b70

subprocess模块

模拟计算机cmd命令窗口

import subprocess

cmd = input('请输入您的指令>>>:').strip()
sub = subprocess.Popen(cmd,                     # 在终端运行的命令
                       shell=True,              # 新开一个终端
                       stdout=subprocess.PIPE,  # 执行完命令, 将正确输出放到一个管道里
                       stderr=subprocess.PIPE   # 将错误输出放到一个管道里
                       )  
# stdout执行命令之后正确的返回结果
print(sub.stdout.read().decode('gbk'))  # 拿到的是 bytes 格式的字符,在windows需要使用gbk编码,linux和mac上是"utf-8"
# stderr执行命令报错之后的返回结果
print(sub.stderr.read().decode('gbk'))  # 拿到的是 bytes 格式的字符,在windows需要使用gbk编码,linux和mac上是"utf-8"

logging日志模块

  • 日志等级
日志等级 用处 数字记录
debug等级 可以帮助我们在平时的开发过程中,帮助我们查看一些输出的信息是否正确,它可以替代我们平时使用的 print() 函数 10
info等级 它代表了一般的消息类信息,只是为了记录一些程序的行为,比如程序执行到了某个位置,进行一些简单的记录 20
warning等级 该等级是一种警告,一般来说程序不会出错,但是可能存在一定的潜在风险(默认从warning级别开始记录日志) 30
error等级 一般对应业务中出现了重大问题。比如异常或者业务逻辑不应该执行到某种情况,我们都可以通过error来进行记录 40
critical等级 比 error 更严重的级别,不过一般来说 error 级别已经很严重了, 所以 critical 很少使用 50
  • 日志模块组成部分
组成部分 名称
日志的产生(准备原材料) logger对象
日志的过滤(剔除不良品) filter对象(可以忽略)
日志的产出(成品) handler对象
日志的格式(包装) format对象

image

  • 日志配置字典
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'
# 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配置
        
logging.config.dictConfig(LOGGING_DIC)  # 自动加载字典中的配置
logger1 = logging.getLogger('购物车记录')
logger1.warning('尊敬的VIP客户 晚上好 您又来啦')
posted @   空白o  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示