python(六)枚举函数、操作MySQL数据库、操作redis、加密模块、jsonpath模块、写日志模块

本文介绍了Python中的enumerate函数,讲解了如何操作MySQL数据库和redis,探讨了加密技术如MD5和base64,还涉及了jsonpath模块解析JSON数据以及使用loguru进行日志记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

enumerate()枚举函数

enumerate()枚举函数,同时列出下标和内容。

l = [[1, 2, 3, 4],[5, 6, 7, 8]]
for row, i in enumerate(l):
    for col, j in enumerate(i):
      print(row, col, j)

运行结果:

0 0 1
0 1 2
0 2 3
0 3 4
1 0 5
1 1 6
1 2 7
1 3 8

操作MySQL数据库

使用pip install pymysql,安装pymysql模块,使用此模块连接MySQL数据库并操作数据库。

import pymysql

# 创建数据库链接
conn = pymysql.connect(
    host="ip地址", # 链接数据库的ip
    user="db_username",   # 用户名
    password="db_password",   # 用户密码
    db="db_name",     # 数据库名称
    port=3306,    # 数据库端口号,默认是3306
    charset='utf8',   # 字符集编码
    autocommit=True    # 自动提交
    )
    
# 创建游标
# cursor = conn.cursor()  # 创建普通的游标,返回结果为元组类型
cursor = conn.cursor(pymysql.cursors.DictCursor)    # 指定返回格式为字典

# 数据库操作
cursor.execute("select * from students limit 5;") # 查询数据库中数据
# cursor.execute("insert into students (name,phone,age,sex) values ('lilili','15000000001',18,'女');")  # 往数据库中插入数据
# cursor.execute('update students set name = "小白" where id = 1;')   # 更新数据库中数据 
# cur.execute('delete from students where id=50 ;')  # 删除数据库中数据

print(cursor.description)  # 查看数据库中表的字段信息

# conn.commit() #提交(insert,delect,update都需要提交。如果在创建数据库连接时设置autocommit=True,则不需要使用该语句提交数据库增删改的操作)

# print(cursor.fetchall())  # 获取sql执行的结果,获取表中所有数据,返回数据是二维数组
# print(cursor.fetchone())  # 只获取一条数据,返回数据是一维数组
print(cursor.fetchmany(5))  # 输入几获取几条数据,返回数据是二维数据组

for line in cursor:  # 取表中每行数据
    print(line)

cursor.close()  # 关闭游标
conn.close()    # 关闭数据库链接

普通游标和指定返回字典的游标的结果:

# conn.cursor()普通游标返回数据
((1, '小黑', '11111111111', 18, '男'), (2, '小白', '11111111112', 18, '男'))
# conn.cursor(pymysql.cursors.DictCursor)指定返回字典的游标返回数据
[{'id': 1, 'name': '小黑', 'phone': '11111111111', 'age': 18, 'sex': '男'}, {'id': 2, 'name': '小白', 'phone': '11111111112', 'age': 18, 'sex': '男'}]

操作redis

使用pip install redis安装redis模块,使用redis模块操作redis。
redis中string类型数据:
在这里插入图片描述
redis中hash类型数据:
在这里插入图片描述

import redis

# 创建数据库链接
r = redis.Redis(
    host="ip",    # redis的ip
    password="password",   # 密码
    port=6379,    # 端口号,默认6379
    db=0,      # 指定操作redis中的哪个库,redis有16个库0-15
    decode_responses=True  # 返回的结果会自动把bytes类型转为字符串
	)

# string类型数据操作
r.set("aaa","352v235235t",100) # 新增和修改数据,100为失效时间,单位是s,失效时间可不指定
r.delete("aaa") # 删除数据
print(r.get("aaa")) # 查询数据,返回结果为“b'352v235235t'”,返回是bytes类型
print(r.get("aaa").decode()) # 将字节类型转为字符串类型,如果创建数据库链接时,指定decode_responses=True,则不需要在进行类型转换。
print("aaa".encode())  # 把字符串转成bytes

# hash类型数据操作
r.hset("stu","lili1",'{"id":1,"username":"xxx"}')  # 新增和修改数据
print(r.hdel("stu","lili1"))  # 删除数据
print(r.hget("stu","lili1"))  # 查询数据
print(r.hgetall("stu"))   # 查询全部数据
# 将redis返回的bytes类型转换为字典
d={}
for k,v in r.hgetall("stu").items():
    k = k.decode()
    v = v.decode()
    d[k] = v
print(d)

r.flushdb()   # 只清空当前数据库的数据
r.flushall()  # 清空所有数据库里面的所有数据
r.expire("stu",100) # 对key设置过期时间
print(r.keys())   # 获取当前数据库里面所有的key
print(r.keys("*stu*")) # 模糊匹配,查找数据库中含有“stu”的key
print(r.exists("aaa"))  # 查看某个key是否存在,0代表不存在,1代表存在
print(r.type("aaa")) # 查看key的类型

加密模块

MD5加密

import hashlib

s ="1234"
bs = s.encode()
m = hashlib.md5(bs)
# m = hashlib.sha256(bs)   #其他加密方式
# m = hashlib.sha512(bs)
# m = hashlib.sha224(bs)
print(m.hexdigest())   # 同样的字符串,使用md5加密后结果都一样。加密后不可逆

# 加盐
s ="1234" + "dfsdffadf#@^$*#"   # 在字符串后面加上随机生成的字符串,这一部分叫盐值

def my_md5(s, salt=""):
    new_s = str(s) + salt
    m = hashlib.md5(new_s.encode())
    return m.hexdigest()
result = my_md5(12345, "ds@#^@")
print(result)

运行结果:

81dc9bdb52d04dc20036dbd8313ed055
762463a6bb94560ad1707d692907a45d

base64加解密

import base64

# 加密
s = "jejigjfgiwtuiruerweiowq"
result = base64.b64encode(s.encode()).decode()
print(result)

# 解密
s1 = "amVqaWdqZmdpd3R1aXJ1ZXJ3ZWlvd3E="
result = base64.b64decode(s1).decode()
print(result)

运行结果:

amVqaWdqZmdpd3R1aXJ1ZXJ3ZWlvd3E=
jejigjfgiwtuiruerweiowq

jsonpath模块

使用pip install jsonpath安装jsonpath模块,使用jsonpath模块来解析多层嵌套的json数据。

import jsonpath

jsona ={
    "money":19000,
    "hose":{
        "beijing":["三环","四环","五环"],
        "shanghai":["静安区","浦东新区"]
    },
    "car":["bmw","benz","audi","byd"],
    "pets":[
        { "name":"xiaohei","type":"dog"},
        { "name":"xiaobai","type":"cat"},
        { "name":"xiaofen","type":"cat"},
        { "name":"xiaolan","type":"dog"},
    ]
}

print(jsonpath.jsonpath(jsona,"$.pets[0].type"))
print(jsonpath.jsonpath(jsona, "$.shanghai"))
print(jsonpath.jsonpath(jsona, "$..pets"))
print(jsonpath.jsonpath(jsona,"$..name"))
# 嵌套n层也能取到所有key的值,其中:“$”表示最外层的{},“..”表示模糊匹配,当传入不存在的key时,程序会返回false

运行结果:

['dog']
False
[[{'name': 'xiaohei', 'type': 'dog'}, {'name': 'xiaobai', 'type': 'cat'}, {'name': 'xiaofen', 'type': 'cat'}, {'name': 'xiaolan', 'type': 'dog'}]]
['xiaohei', 'xiaobai', 'xiaofen', 'xiaolan']

写日志模块

使用pip install loguru安装loguru模块,使用loguru模块中的logger对象来写日志。

from loguru import logger
import sys

# 日志级别: 
# debug 调试信息打印日志比较详细,级别最低
# info 正常的提示信息,级别较低
# waring 警告信息,不影响代码往下运行,级别较高
# error  出错了,级别最高

# 日志级别排序
# DEBUG < INFO < WARNING < ERROR

logger.remove()   # 删掉默认设置
fmt = '[{time}][{level}][{file.path}:line:{line}:function_name:{function}] || msg={message}'
logger.add(sys.stdout,format=fmt,level="DEBUG") # 系统标准输出,设置日志级别并在控制台打印出来,是打印此级别以上的日志
logger.add("a.log",format=fmt,level="DEBUG",encoding="utf-8",enqueue=True,rotation="1 day")  # 将日志写入文件
# enqueue=True,异步写日志
# rotation可以设置大小,超过多大就产生一个新文件 1 kb ,500 m ,1 g
# rotation可以多长时间,1 day   1 hour
# rotation几点创建新文件,00:00  1:00
# retention = 7 days #多长时间后会删除以前产生的日志,当前的日志不会受影响
logger.add('a.log', level='DEBUG', encoding='utf-8', enqueue=True, rotation='20 kb')  # 文件超过多大就新生成一个新文件
logger.add('a.log', level='DEBUG', encoding='utf-8', enqueue=True, rotation='01:00')  # 每天1点创建新文件
logger.add('a.log', level='DEBUG', encoding='utf-8', enqueue=True, rotation='2 week')  # 文件超过2周就清理掉
logger.add('a.log', level='DEBUG', encoding='utf-8', enqueue=True, retention='7 days')  # 7天后会删除之前产生的日志

logger.debug("debug") # 打印信息比较多
logger.info("info")   # 正常的提示信息
logger.warning("warning") # 警告
logger.error("error")  # 错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值