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") # 错误