pei_blog

导航

 

一、内容大纲

 

 

 

 

二、作业讲解

2.1清理日志

# 清理日志
import os
from day5.time模块 import time_to_str,str_to_timestmap
def clean_log(path,day=3):
# 天转化为秒
step=day*60*60*24
if os.path.isdir(path):
for cur_path,dirs,files in os.walk(path):
for file in files:
# 先进行路径拼接 用于删除
file=os.path.join(cur_path,file)
if file.endswith(".log"):
file_date=file.split("_")[-1].split(".")[0]
if str_to_timestmap()-str_to_timestmap(file_date,"%Y-%m-%d")>step:
os.remove(file)
elif os.path.getsize(file)==0 and file_date!= time_to_str(format="%Y-%m-%d"):
os.remove(file)
print("清理完成")

else:
print("输入正确路径")
if __name__=="__main__":
clean_log("logs")

2.2生成双色球

import random
def ssq(num):
all_ball=set()
red_range=[str(i).zfill(2) for i in range(1,34)]

blue_range= [str(i).zfill(2) for i in range(1,17)]
while num !=len(all_ball):
red= random.sample(red_range,6)
blue=random.choice(blue_range)
red=" ".join(red)
res="红球:%s 篮球:%s" %(red,blue)
all_ball.add(res)
return all_ball
def main():
num=input("num:")
if num.isdigit():
result=ssq(int(num))
for ball in result:
print(ball)
else:
print("请输入数字")
if __name__ == '__main__':
main()

2.3 生成随机密码

# 生成密码
import random,string
def create_pwd(num):
all=set()
all_choice=set(string.digits+string.ascii_letters)

while num !=len(all):
length=random.randint(8,15)
pwd=random.sample(all_choice,length)

if set(pwd)&set(string.digits) and set(pwd)& set(string.ascii_uppercase)\
and set(pwd)& set(string.ascii_lowercase):
pwd="".join(pwd)+"\n"
all.add(pwd)
with open("password.txt","a+",encoding="utf-8") as f:
f.writelines(all)
def main():
num=input("num:")
if num.isdigit():
create_pwd(int(num))
if __name__ == '__main__':
main()

三、第三方模块

3.1第三方模块安装

1.自动化安装:

(1)pip安装

前置条件:环境变量配置,需要将python安装目录以及script目录加入到环境变量中

安装:pip install 第三方模块名称

例:安装汉字转拼音模块:

pip install xpinyin

(2)pip不存在时:

python绝对路径 -m pip install xpinyin

2.手动安装

(1)下载安装包

(2)whl结尾安装

进入下载目录 然后使用 pip install 报名处

例:pip install xpinyin-0.7.6-py3-none-any.whl

(3)tag.gz结尾安装

进入解压好的目录

使用pip setup.py install

例:

cd C:\Users\pei\Downloads\xpinyin-0.7.6
python setup.py install

 

3.2汉字转拼音模块

1.安装xpinyin模块

pip install xpinyin

2.使用

引入--实例化--获取拼音--打印拼音

import xpinyin

p=xpinyin.Pinyin()

pinyin=p.get_pinyin(需要转化的字段,链接方式)

print(pinyin)

例:

name="李小鹏"
import xpinyin
p=xpinyin.Pinyin()
pinyin=p.get_pinyin(name,"")
print(pinyin)
结果:lixiaopeng

3、练习:将一批中文名称转化为拼音 相同时名字依次+1

s="""
廖娟
赵兰英
罗淑英
袁玉华
萧秀华
徐磊
宋桂荣
莫瑜
陆帅
王淑兰
魏建华
苏军
王飞
李秀梅
罗秀兰
李波
李艳
李燕
李雁
薛建平
黄成
周旭
季军
杨秀荣
关兰英
伍欣
郑宇
王雷
李娟
雷霞
李艳
徐玉英
仇雪梅
李雷
王洋
李建
孙晶
何飞
孙林
郑玲
王桂香
田强
陈华
吴秀云
董强
阮秀云
王洋
谢秀云
潘玉
邹想
吕秀云
罗荣
杨琴
韩欣
邬秀华
章欣
安军
李林
李萍
王勇
莫艳
余凤兰
吴建军
白晶
张燕
殷晨
朱宇
欧阳艳
范雪
杨建
梁杰
林丹丹
许雪梅
任敏
石娟
龚楠
傅建平
李建
刘娟
陈璐
李欢
朱萍
李凯
王静
胡桂英
陈凤兰
温桂芝
蔡波
蒋林
韦坤
欧莹
黄桂荣
单玲
张荣
艾涛
张博
谢龙
张丽丽
林丽娟
李帅
刘东
刘琴
"""
all_name_list=[]
dict={}
names=s.split()
p=xpinyin.Pinyin()
for name in names:
p_name=p.get_pinyin(name,"")
if p_name not in all_name_list:
all_name_list.append(p_name)
else:
if p_name not in dict:
dict[p_name]=1
else:
dict[p_name] +=1
for name,count in dict.items():
for i in range(1,count+1):
new_p_name="%s%s" %(name,i)
all_name_list.append(new_p_name)
print(all_name_list)

3.3faker模块

1、安装:pip install faker

2、作用:生成随机数据,如生成随机名字 身份证 电话号等

3、使用:引用--实例化--产生数据

import faker
# 实例化
f=faker.Faker(locale="zh_CN")
#取随机名字
print(f.name())# 名字
print(f.address()) #随机地址
print(f.city())# 城市
print(f.chrome()) #浏览器标识
print(f.date_time())#随机时间
print(f.user_name())# 用户名
print(f.street_address())#街道地址
print(f.phone_number())#手机号
print(f.credit_card_number())# 信用卡
print(f.credit_card_full())#全信用卡信息
print(f.ipv4())# ip地址
print(f.ipv6()) #ip地址
print(f.name_female()) # 女名字
print(f.name_male())# 男名字
print(f.ssn()) #身份证

4、练习:随机生成100个名字

import  faker
f=faker.Faker(locale="zh_CN")
for i in range(100):
print(f.name())

5、dir():获取所有的方法

import  faker
f=faker.Faker(locale="zh_CN")
print(dir(f))

3.4操作execl模块

1、模块安装:pip install xlwt

2、作用:操作execl

3、操作方法:引用--实例化--写入--保存文件

import xlwt
book=xlwt.Workbook()
sheet=book.add_sheet("sheet1")
sheet.write(0,0,"id") # 0行0列
sheet.write(1,0,"1") # 1行0列
book.save("0527.xls") # 保存 结尾用xls,如果用xlsx,用office打开有问题 wps打开没问题

4、enumerate()用法:实现下标和值对应

例:

l=["lxp","may","candy"]
print(list(enumerate(l)))
结果:[(0, 'lxp'), (1, 'may'), (2, 'candy')]

5、练习:将两个二维数组写入到execl中

import xlwt
students=[
[1,"曾若天","男","北京"],
[2,"李雪松","男","北京"],
[3,"candy","女","深圳"],
[4,"刘佩","女","北京"],
]
title=["id","name","sex","city"]
students.insert(0,title)
book=xlwt.Workbook()
sheet=book.add_sheet("学生信息")
for row ,student in enumerate(students):
for col, value in enumerate(student):
sheet.write(row,col,value)
book.save("students.xls")

四、复制文件

4.1 shutil模块

1、copyfile:复制文件,必须要传新的文件名称,

例:

shutil.copyfile("password.txt","../day5/pwd.txt") # 原文件,新文件

2、copy:复制文件,可以不要传新的文件名称

例:

shutil.copy("password.txt",'../day2/') 在day2下面复制一个和同名的文件

3、copytree:复制目录(文件夹)

shutil.copytree("logs","log22s") # 复制文件夹

4、rmtree:删除非空文件

 shutil.rmtree('logs')

4.2sys模块

1、sys.version_info:获取当前python版本,返回一个元组

print(sys.version_info) 结果:sys.version_info(major=3, minor=9, micro=4, releaselevel='final', serial=0)
print(sys.version_info[0]) 结果:3
print(sys.version_info[1]):结果:9

2、sys.version:获取当前python版本,返回一个字符串

print(sys.version) 结果:3.9.4 (tags/v3.9.4:1f2e308, Apr  6 2021, 13:40:21) [MSC v.1928 64 bit (AMD64)]

3、sys.platform:获取当前系统类型

print(sys.platform) 结果:win32
# mac,darwin
# windows:win32
# linux:linux

4、sys.exit():退出系统 与quit比较像

sys.exit("系统退出") # 和quit比较像

5、sys.argv:用来获取运行python文件时传入的参数

print(sys.argv) #['D:/李兴培/besttest测试/测开代码/day6/05复制文件.py']
例:
if len(sys.argv)>1:
command=sys.argv[1]
if command=="bak":
print("备份数据库")
elif command=="clean":
print("开始清理xxx表")
elif command=='create':
print("创建表格")
else:
print("输入有误")
else:
print("输入有误")
input("command:")
在cmd里面运行 :文件名称+命令

 

 

 

4.3、quit函数

内置函数,函数遇到quit()立马退出

msg=input("input:")
if msg=="q":
quit("程序退出")

五、操作数据库

5.1操作数据库

1、操作数据库流程:

(1)流程:安装第三方模块--创建连接--创建游标--执行语句--获取结果--关闭游标--关闭连接

(2)注意事项:密码必须为字符,端口号必须为int类型, 创建连接是端口号有默认值为3306 可以不写

(3)创建连接其他字段:charset="utf8"非utf-8 用于解决中文乱码问题,autocommit=True 为自动提交,用于更新数据库内容时(例二可以用到)

 

例一、查询语句

# 引用
import pymysql
ip="xxx.xx.xxx.xx"
user="jxz"
password="123456" #必须是字符串
db="jxz"
port=3306 # 必须写int类型
# 创建连接
connect=pymysql.connect(host=ip,user=user,password=password,db=db,port=port,charset="utf8")
# 创建游标
cursor=connect.cursor()
sql="select * from test1"
# 执行语句
cursor.execute(sql)
# 获取结果
res=cursor.fetchall()
print(res)
# 关闭游标
cursor.close()
# 关闭连接
connect.close()

例二、插入 修改 删除语句:执行--提交/回滚

(1)提交:connect.commit()

(2)回滚:connect.rollback()

import pymysql
ip="xxx.xx.xxx.xx"
user="jxz"
password="123456" #必须是字符串
db="jxz"
port=3306 # 必须写int类型
# 创建连接
connect=pymysql.connect(host=ip,user=user,password=password,db=db,port=port,charset="utf8")
# 创建游标
cursor=connect.cursor()
# sql="select * from test1"
# 修改语句需要提交
sql="update test1 set name ='lxp' where id =1"
# 执行语句
cursor.execute(sql)
connect.commit()
# 获取结果
res=cursor.fetchall()
print(res)
# 关闭游标
cursor.close()
# 关闭连接
connect.close()

2、fetchall,fetchone,fetchmany

(1)cursor.fetchall()获取sql执行所有结果 始终返回一个二维数组

sql="select * from test1"
# 执行语句
cursor.execute(sql)
res=cursor.fetchall()
结果:((1, 'lxp', 0, '13555768930'), (2, '隋春林', 0, '13245678909'), (4, '李宇春', 1, '12345678901'), (8, '李宇春1', 1, '12245678901'))

(2)cursor.fetchone():获取一条

sql="select * from test1"
# 执行语句
cursor.execute(sql)
res=cursor.fetchone()
结果:(1, 'lxp', 0, '13555768930')

(3)cursor.fetchmany(n):获取n条,返回也是二维数组

sql="select * from test1"
# 执行语句
cursor.execute(sql)
res=cursor.fetchmany(2)
结果:((1, 'lxp', 0, '13555768930'), (2, '隋春林', 0, '13245678909'))

3、获取表里字段描述

cursor.execute(sql)
print(cursor.description)

4、返回字典格式设置:游标里面指定:pymysql.cursor.DictCursor

cursor=connect.cursor(pymysql.cursors.DictCursor)
# 修改语句需要提交
# sql="update test1 set name ='lxp' where id =1"
sql="select * from test1"
# 执行语句
cursor.execute(sql)
res=cursor.fetchone()
结果:{'id': 1, 'name': 'lxp', 'sex': 0, 'phone': '13555768930'}

5.2大文件读取

读取数据量比较大的时候,可以直接循环游标,每次取得就是表里的一条数据

sql="select * from test1"

# 执行语句
cursor.execute(sql)
for c in cursor:
print(c)

5.3函数封装

1、代码

import pymysql
def op_mysql(mysql_info:dict,sql:str,all=True):
connect=pymysql.connect(**mysql_info)
cursor=connect.cursor()
cursor.execute(sql)
res=None
if sql.strip().lower().startswith("select"):
if all:
res=cursor.fetchall()
else:
res=cursor.fetchone()
return res
if __name__ == '__main__':
mysql_info={"host":"xxx.xx.xxx.xx","user":"jxz",
"password":"123456" ,"db":"jxz","port":3306,
"autocommit":True,"charset":"utf8"}
sql1="select * from test1"
sql2="select * from test1 where id =1"
print(op_mysql(mysql_info,sql1))
print(op_mysql(mysql_info,sql2, False))

2、*与**的作用

一个* 对应的列表 将列表解开 对应到形参上

def add(a,b):
return a+b
l=[1,2]
print(add(*l))
结果:3

两个* 对应字典,将字典解开,对应函数形参,字典的key与函数的形参需要命名一致

def add(a,b):
return a+b
d={"a":1,"b":2}
# 将字典解开 变为a=1 b=2 保证字典里面的key与函数形参一致
print(add(**d))
结果:3

六、md5加密

6.1hashlib模块

1、介绍:hashlib为内置模块,进行加密 不可逆

2、使用:

import hashlib
s="lxp"
m=hashlib.md5(s.encode())# encode()将字符串转化为字节类型 加密的时候必须为字节类型
print(m.hexdigest())
结果:6ae96a1f4df95ecd47ef0553e7b2fffa:同一个字符串的md5码是一样的

encode()将字符串转化为字节类型

6.2加盐

1、作用:增加密码复杂度

2、将盐加在中间

# 将盐加在中间
ls=list(s)
index=len(ls)//2
ls.insert(index,salt)
new_ls="".join(ls)
print(new_ls)

m=hashlib.md5(new_ls.encode())
print(m.hexdigest())

3、函数封装

def md5_pwd(s,salt=""):
s=str(s)
new_s="%s%s" %(s,salt)
m=hashlib.md5(new_s.encode())
print(m.hexdigest())

md5_pwd("123")
md5_pwd("123","123")

4、对文件进行加密:读取文件 以字节类型打开

with open("xpinyin-0.7.6-py3-none-any.whl","rb") as f:
m=hashlib.md5(f.read())
print(m.hexdigest())


posted on 2021-05-27 14:32  pei_blog  阅读(123)  评论(0)    收藏  举报