这周不再存文件里了,我们要开始操作数据库了~~~
一、数据库
#传统的关系型数据库 #mysql oracle SQL server sqllite db2 #id name passwd #数据存在磁盘上 #使用sql语句来操作数据 #表与表之间有关系 #非关系型数据库 nosql k-v形式 #{'name':'xxx',} # mogodb 数据存在磁盘上的 #redis 数据存在内存里 1.1 Redis数据库 连接redis数据库 way1: RedisDesktopManager客户端连接
way2: 代码连接
import redis r = redis.Redis(host='ip',port=端口,password='密码',db=10) #连接redis #增删改查 #操作string类型 # r.set('zjr1','hahahhaha',50)#增加、修改数据 ,三个参数分别为 k、v、过期时间 # res = r.get('zjr1')#获取数据 # print(res) # #二进制 byte # r.delete('zjr')#删除 # print(res.decode())#编码 #其它的方法 # print(r.keys('*info'))#获取到所有的key # print(r.exists('zjr1'))#判断这个key是否存在 # r.flushdb()#可以清空当前数据库里面所有的key # r.expire('session_crm',600)#指定key的失效时间 # print(r.ttl('session_crm'))#用来查看这个key的失效时间 # print(r.type('session_crm'))#用来查看key的类型
# hash 哈希类型的key #哈希类型理解为一个字典嵌套字典 #select 10 redis的命令里面select 8 就是切换数据库 #增删改查 # r.hset('session_crm','zjr','dddddgskjfdd') # r.hset('session_crm','zjr1','dddddgskjfdd') # r.hset('session_crm','zjr2','dddddgskjfdd') # r.hset('session_crm','zjr3','dddddgskjfdd') # r.hset('session_crm','zjr4','dddddgskjfdd') # r.hset('session_crm','zjr5','dddddgskjfdd') # #修改也是hset # r.hdel('session_crm','zjr')#删除指定的小key # r.delete('session_crm')#直接删除大key #查 # print(r.hget('session_crm','zjr'))#获取指定的小key里面的数据 print(r.hgetall('session_crm'))#获取哈希类型里面的所有数据
将数据以字典形式显示
print(r.hgetall('session_crm'))#获取哈希类型里面的所有数据
不带“b”的字典显示:
1 res = r.hgetall('session_crm')#获取哈希类型里面的所有数据2 a = {}3 for k,v in res.items():4 a[k.decode()] = v.decode()5 print(a)
1.2 mysql数据库
1 # 1.连上数据库 ip 账号、密码 端口号、数据库 2 # 2.执行sql 3 # 3.获取到结果 4 5 import pymysql 6 #端口号是int 7 coon = pymysql.connect(host='ip',user='用户',password='密码', 8 port=3306,db='数据库',charset='utf8',autocommit=True) 9 cur = coon.cursor()#建立游标 10 sql = 'select * from app_student;' 11 # sql = 'insert into nhy (name,pwd) value("zjr123","123456");' 12 # sql2 = 'select * from nhy where name="zjr123";' 13 cur.execute(sql)#执行SQL语句,它只是执行sql语句,不会返回结果 14 # coon.commit()#除了查询都需要提交一下才会成功,有autocommit=True这个参数就可以不写commit 15 print(cur.fetchall())#获取所有结果 16 # print(cur.fetchone())#只获取一条 17 # print(cur.fetchmany(2))#指定获取几条 18 cur.close()#游标关闭 19 coon.close()#连接关闭
结果是二元数组
操作mysql数据库的函数:
(此函数存在两个问题 1.每操作一次数据库就要连接一次 2.如果sql语句写错了就会直接报错;第一个的解决办法是用类写,第二个的解决办法是抓取一下异常try一下)
1 #操作数据库的函数 2 def my_db(ip,user,passwd,db,sql,port=3306,charset='utf8'): 3 coon = pymysql.connect(host=ip,user=user, 4 password=passwd, 5 db = db, 6 port=port, 7 charset=charset, 8 autocommit=True 9 ) 10 cur = coon.cursor() 11 sql=sql.strip() 12 cur.execute(sql) 13 sql_start = sql[:6].lower()#取SQL的开头6位,转换成小写 14 if sql.startswith('select') or sql.startswith('show'): 15 data = cur.fetchall() 16 else: 17 data ='ok' 18 cur.close() 19 coon.close() 20 return data
加密模块
1 import hashlib2 s='123456'3 # print(s.encode())4 m = hashlib.md5(s.encode())#必须传一个bytes类型的5 print(m.hexdigest())#获取到加密后的结果6 # print(dir(m))#用dir可获取它拥有的方法7 #md5不可逆8 #所有一样的字符串,md5之后的结果都是一样的9 #撞库
有很多不同的加密
发邮件
第一步:安装模块pip install yagmail
第二步:获取授权码:
代码:
1 import yagmail 2 #账号、密码、邮箱服务器、收件人、抄送人 、 主题、正文、附件 3 4 username = '1334***924@qq.com' 5 passwd = 'glfy*****gkbaff'#授权码 6 mail = yagmail.SMTP(user=username,password=passwd,host='smtp.qq.com',smtp_ssl=True) 7 # 安全协议,smtp_ssl=True,如果是qq邮箱得加这个参数 8 #host='smtp.qq.com'邮箱服务器 163邮箱就是smtp.163.com 9 #连接上邮箱了10 mail.send(to=['1334****24@qq.com'],11 cc='1334***24@qq.com',12 subject='作业',13 contents='好好学习',attachments=r'C:\Users\Mezhou\PycharmProjects\untitled\day6\发送邮件.py'14 ) #cc是抄送15 #16 #卸载模块pip uninstall yagmail
如果你发送的附件名,中文是乱码的话 卸载模块pip uninstall yagmail 用群里给的这个yagmail安装包
重安之后结果附件标题中文不显示乱码了
生 成 器
生成器:为了节省内存的。
每次循环的时候,就按照这个规则(你写的逻辑)去生成一个数据
res = ['a','1']
只有你在每次循环的时候,才按照这个规则去帮你生成一个数据
生成器,节省空间,增加了CPU的计算时间 list,用空间换时间
1 nums = [str(i).zfill(2) for i in range(10)]#由[] 换()就是生成器2 print(nums)
结果:返回一个list
由[] 换()就是生成器
1 nums = (str(i).zfill(2) for i in range(10))#由[] 换()就是生成器2 print(nums)
结果:
节约了空间,不占内存,可以直接循环就可以打印出值
map——自动循环调用函数
1 import os2 def makir(dir_name):3 if not os.path.isdir(dir_name):#判断文件夹是否存在4 os.mkdir(dir_name) #不存在就创建5 return True#返回True6 dir_names =['android','ios','tomcat','java','python','php','nginx']7 res =list(map(makir,dir_names))#自动循环帮你调用函数的8 print(res)#返回生成器,节省内存
返回结果
生成的文件夹
map和filter
1 def my(num):2 if num%2==0:3 return True4 res = list(filter(my,range(10)))#过滤,它把函数处理结果为假的给过掉了5 #只保留函数返回真的数据6 res2 = list(map(my,range(10)))#不管返回啥,我都给你拿到7 print(res)8 print(res2)
取路径
查看当前目录下有什么:os.listdir('.')
改变当前的工作目录:chdir()
system()执行操作系统命令:
popen()也是执行操作系统命令,无乱码
datetime模块
1 import datetime2 print(datetime.date.today())#当天的时间,年月日3 print(datetime.datetime.today())#当前的时间,年月日+时分秒
1 import datetime2 # print(datetime.date.today())#当天的时间,年月日3 # print(datetime.datetime.today())#当前的时间,年月日+时分秒4 # res =datetime.datetime.today()+datetime.timedelta(hours=-10,minutes=-20)#非当时时间,默认天数,其它的加参数,days,5 res =datetime.datetime.today()+datetime.timedelta(-1)#一天前的时间6 print(res.time())#只取时间7 print(res.date())#只取日期8 print(res.timestamp())#取时间戳9 print(res.strftime('%Y-%m %H:%M:%S'))#格式化好时间
random模块
1 import random2 print(random.random())#取小于1的随机的小数3 print(random.randint(1,10))#指定范围,取随机的整数,可以取到104 print(random.choice('abcdffgg'))#随机选择一个,只能选择一个5 print(random.sample('abcdffgg',3))#随机选择n个,返回的是一个list6 print(random.uniform(8.8,10))#指定一个范围,然后取一个随机小数
写日志:
安装牛牛自己写的nnlog模块
import nnlogmy_log = nnlog.Logger('zjr.log',level='error',when='S',backCount=5)#level='error'生成哪个级别的#when参数按天(秒)生成日志文件,按天生成日志文件#backCount=5最多只保留5个日志,多的会被删除my_log.debug('这是debug级别的')my_log.info('这是info级别的')my_log.warning('这是warning级别的')my_log.error('这是error级别的')# my_log.surprise()# debug 最详细,最清晰的,最不严重的,debug时打印参数,调试信息# info 正常的代码走到哪的信息# waring 警告,输入参数不正确# error 出错