python-数据库&邮件

这周不再存文件里了,我们要开始操作数据库了~~~

一、数据库


#传统的关系型数据库
#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 hashlib
2 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:UsersMezhouPycharmProjectsuntitledday6发送邮件.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 os
2 def makir(dir_name):
3     if not os.path.isdir(dir_name):#判断文件夹是否存在
4         os.mkdir(dir_name) #不存在就创建
5         return True#返回True
6 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 True
4 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 datetime
2 print(datetime.date.today())#当天的时间,年月日
3 print(datetime.datetime.today())#当前的时间,年月日+时分秒

1 import datetime
2 # 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 random
2 print(random.random())#取小于1的随机的小数
3 print(random.randint(1,10))#指定范围,取随机的整数,可以取到10
4 print(random.choice('abcdffgg'))#随机选择一个,只能选择一个
5 print(random.sample('abcdffgg',3))#随机选择n个,返回的是一个list
6 print(random.uniform(8.8,10))#指定一个范围,然后取一个随机小数

写日志:

安装牛牛自己写的nnlog模块

import nnlog

my_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  出错


原文地址:https://www.cnblogs.com/Mezhou/p/9300007.html