python学习笔记(五)导入模块原理、手动安装模块导出模块、操作数据库、读写excel、循环写入excel、修改excel、写日志、发送邮件、MD5加密、sha256

1.导入模块原理

#  1.python中模块类型:
#      python中模块分为3种,1、标准模块(python自带的模块 如:os time等),2、第三方模块(如pymysql、xlrd等), 3、自己写的模块(一个python文件就是一个模块)

#  2.导入导入模块的实质
#      就是把所导入的模块运行了一遍

#  3.导入模块的顺序
#      1,先从当前目录下找
#      2,再从python的环境变量下找(python环境变量查看方法:import sys  print(sys.path)),模块放到环境变量中任意一个目录下都可以
#         而且放到环境变量下导入的时候会自动提示,而且不会像导入当前目录下python文件那样被标红色波浪线(虽然不影响执行^_^)
#      注意:2中所说的环境变量跟咱们系统的环境变量不是一回事!!!

#  4.if __name__ == '__main__':
#         的作用就别的文件里面导入这个python文件的时候
#         不会执行if __name__ 里面代码
#         而当前文件的测试代码,如函数调用可以写在这里就算忘记删除了,等别人调用的时候也不会被执行

2.手动安装模块、导出模块

#  安装第三方模块有以下两种方法:
#       1,在线安装:执行命令 pip install 模块名  如果是python的话执行命令 pip3 install 模块名 (例:pip3 install xlrd)
#       2,手动安装(也有2种方式)
#                 1)下载.whl文件到本地
#                       执行命令 pip install 本地文件目录(例:pip install e:\\dowloads\\pymysql.whl)
#                 2)下载.tar.gz文件
#                       1、解压 (例:tar -zxvf pymysql.tar.gz)
#                       2、进入解压后的文件夹
#                           执行命令:python setup.py install
# pip list 列出当前安装了哪些模块
# pip freeze > /Users/wangxiaoyu/百度云同步盘/pyton测开/day5/pip_intall_list.txt 把安装的模块导出到执行文件
# pip intall -r /Users/wangxiaoyu/百度云同步盘/pyton测开/day5/pip_intall_list.txt 把指定文件中的所有模块进行批量安装

3.操作数据库(mysql数据库,需要实现安装第三方模块pymysql)

import pymysql #(不同的数据库需要导入不同的模块,用法也可能有些区别)

# ==========查询==========
# 1.建立链接,port可以不写,默认是3306(是个默认值参数)
conn = pymysql.connect(host='118.26.3.60',port=3306,user='wxy',password='123456',db='python_mysql',charset='utf8')

# 2.建立游标
cur = conn.cursor(pymysql.cursors.DictCursor)#设置返回结果为list,list的中的元素为字典格式,conn.cursor()不设置返回结果格式的话,默认返回的是二维数组

# 3.执行sql----查询
sql = 'select * from app_student where name = "wangxiaoyu"'
cur.execute(sql)

# 4.获取sql执行结果
print(cur.fetchall())#获取所有结果,结果:[{'id': 387, 'name': 'wangxiaoyu', 'sex': '女', 'age': 18, 'addr': '北京', 'grade': '摩羯座', 'phone': '那啥啥', 'gold': 100}]
print(cur.fetchone())#获取一条结果,直接是一个字典而不是在list中,结果:{'id': 387, 'name': 'wangxiaoyu', 'sex': '女', 'age': 18, 'addr': '北京', 'grade': '摩羯座', 'phone': '那啥啥', 'gold': 100}
print(cur.fetchmany(2))#如果查询结果是多条的话,这里可以选择显示几条

# 5.关闭游标
cur.close()

# 6.关闭链接
conn.close()
# ==========修改(增加、删除、修改都必须提交后才能真正写到数据库)==========

# ====方法1.手动提交=======

# 1.建立链接,port可以不写,默认是3306(是个默认值参数)
conn = pymysql.connect(host='118.26.3.60',port=3306,user='wxy',password='123456',db='python_mysql',charset='utf8')

# 2.建立游标
cur = conn.cursor(pymysql.cursors.DictCursor)#设置返回结果为list,list的中的元素为字典格式,conn.cursor()不设置返回结果格式的话,默认返回的是二维数组

# 3.执行sql--插入
sql = "insert into app_student ( `name`, `sex`, `age`, `addr`, `grade`, `phone`, `gold`) values ( 'wangxiaoyu', '女', '18', '北京', '摩羯座', '那啥啥', '100');"

cur.execute(sql)

# 4.手动提交
conn.commit();

# 5.关闭游标
cur.close()

# 6.关闭链接
conn.close()

# 测试结果:
# [{'id': 387, 'name': 'wangxiaoyu', 'sex': '女', 'age': 18, 'addr': '北京', 'grade': '摩羯座', 'phone': '那啥啥', 'gold': 100}]
# ====方法2.自动提交=======
#
# 1.建立链接,port可以不写,默认是3306(是个默认值参数)
conn = pymysql.connect(host='118.26.3.60',port=3306,user='wxy',password='123456',db='python_mysql',charset='utf8',autocommit=True)#autocommit=True执行sql后会自动提交

# 2.建立游标
cur = conn.cursor(pymysql.cursors.DictCursor)#设置返回结果为list,list的中的元素为字典格式,conn.cursor()不设置返回结果格式的话,默认返回的是二维数组

# 3.执行sql--插入
sql = "insert into app_student ( `name`, `sex`, `age`, `addr`, `grade`, `phone`, `gold`) values ( 'wxytest1', '女', '18', '北京', '摩羯座', '那啥啥', '100');"

cur.execute(sql)

# 4.关闭游标
cur.close()

# 5.关闭链接
conn.close()

 操作mysql数据库封装函数工具

"""
该函数实现了对mysql数据库的正删改查操作,并返回操作结果

"""
import pymysql #操作不同的数据库,导入不同的模块,这里导入操作mysql数据库的模块

def op_mysql(host,username,password,db,sql,port = 3306,many_flag = True):#many_flag true代表返回多条数据,False代表只返回一条数据
    conn = pymysql.connect(host = host,port = port,user = username,password = password,db = db,charset = 'utf8',autocommit = True)
    cur = conn.cursor(pymysql.cursors.DictCursor)
    cur.execute(sql)
    if many_flag:
        result = cur.fetchall()
    else:
        result = cur.fetchone()
    cur.close()
    conn.close()
    return result
# 1.查询--返回多条结果
dict = {'host':'118.26.3.60','port':3306,'username':'wxy','password':'123456','db':'python_mysql','sql':'select * from app_student limit 5 '}
print(op_mysql(**dict))

测试结果:
[{'id': 108, 'name': 'Mike', 'sex': '', 'age': 18, 'addr': '北京市昌平区', 'grade': '2th', 'phone': '13761147542', 'gold': 100}, {'id': 109, 'name': 'Michael', 'sex': '', 'age': 18, 'addr': '北京市昌平区', 'grade': '2th', 'phone': '13761111113', 'gold': 100}, {'id': 110, 'name': '小黑', 'sex': '', 'age': 18, 'addr': '河南省济源市北海大道32号', 'grade': '天蝎座', 'phone': '18612539000', 'gold': 100}, {'id': 111, 'name': 'xidis', 'sex': '', 'age': 18, 'addr': '北京市昌平区', 'grade': '天蝎座', 'phone': '18612531000', 'gold': 100}, {'id': 112, 'name': 'xidis', 'sex': '', 'age': 18, 'addr': '北京市昌平区', 'grade': '天蝎座', 'phone': 'qqqqqqqqqqq', 'gold': 2147483647}]
# 2.查询--返回1条结果
dict = {'host':'118.26.3.60','port':3306,'username':'wxy','password':'123456','db':'python_mysql','sql':'select * from app_student where name="wxytest1"','many_flag':False}
print(op_mysql(**dict))
#
# 测试结果:
# {'id': 388, 'name': 'wxytest1', 'sex': '女', 'age': 18, 'addr': '北京', 'grade': '摩羯座', 'phone': '那啥啥', 'gold': 100}
# 3.修改
dict = {'host':'118.26.3.60','port':3306,'username':'wxy','password':'123456','db':'python_mysql','sql':'update app_student set phone = "就不告诉你" where name = "wxytest1"'}
print(op_mysql(**dict))

# 测试结果:
# ()
# 查询后发现已更改:
# {'id': 388, 'name': 'wxytest1', 'sex': '女', 'age': 18, 'addr': '北京', 'grade': '摩羯座', 'phone': '就不告诉你', 'gold': 100}
# 4.新增  `name`, `sex`, `age`, `addr`, `grade`, `phone`, `gold`)
dict = {'host':'118.26.3.60','port':3306,'username':'wxy','password':'123456','db':'python_mysql','sql':'insert into app_student (`name`,`sex`,`age`,`addr`,`grade`,`phone`,`gold`) VALUES ("wxytest668899","女",18,"北京","摩羯座","保密",100)'}
print(op_mysql(**dict))

# 测试结果:
# ()
# 通过查询语句查看:
# [{'id': 400, 'name': 'wxytest668899', 'sex': '女', 'age': 18, 'addr': '北京', 'grade': '摩羯座', 'phone': '保密', 'gold': 100}]
# 5.删除
dict = {'host':'118.26.3.60','port':3306,'username':'wxy','password':'123456','db':'python_mysql','sql':'delete from app_student where name = "wxytest668899"'}
print(op_mysql(**dict))

# 测试结果:
# ()
# 通过查询语句查看:
# ()

4.读写excel

 操作excel

import xlrd

book = xlrd.open_workbook('名单.xlsx')
# sheet = book.sheet_by_index(0)#通过索引方式获取sheet
sheet = book.sheet_by_name('人员名单')
row = sheet.row_values(0)#获取指定行的数据 list
col = sheet.col_values(0)#获取指定列的数据 list
value = sheet.cell(0,0).value #获取指定单元格内容

print(row)
print(col)
print(value)

测试结果:
['姓名', '性别', '年龄', '电话', '地址']
['姓名', 'wangxiaoyu', 'lixiaokai', 'lijunhao', 'lixinran', 'liheping', 'lisan']
姓名
print(sheet.nrows)#获取当前sheet中一共有多少行
print(sheet.ncols)#获取当前sheet中一共有多少列

测试结果:
7
5

5.循环写入excel

import xlwt

book = xlwt.Workbook()#1.创建excel

sheet = book.add_sheet('人员名单')#2.创建一个sheet表单

title = ['姓名', '性别', '年龄', '电话', '地址']

userinfo = [['wangxiaoyu','',18,'保密哦1','太长了就不说啦1'],['lixiaokai','',19,'保密哦2','太长了就不说啦2'],['lijunhao','',5,'保密哦3','太长了就不说啦3']]

# 写title
for rn,row in enumerate(title):
    sheet.write(0,rn,row)#3.写入内容

# 写单元格
for rn,rows in enumerate(userinfo,1):
    for cn,col in enumerate(rows):
        sheet.write(rn,cn,col)

book.save('student_info.xls')#4.保存excel


测试结果:
student_info.xls

6.修改excel

import xlrd
from xlutils import copy

#1.获取excel
book = xlrd.open_workbook('student_info.xls')
#2.复制一个新的excel
new_book = copy.copy(book)
# 3.创建一个sheet
sheet = new_book.get_sheet(0)

addr = ['北京1','北京2','北京3']

for cn,col in enumerate(addr,1):
    #4.修改
    sheet.write(cn,4,col)

#5.保存
new_book.save('student_info.xls')

测试结果:
student_info.xls

7.写入日志

import nnlog
import time

while True:
    # level:输出设么级别的日志 backCount:最多保留几个日志文件 when:按什么时间单位产生一个新文件 interval:间隔多长时间执行一次删除文件操作
    log = nnlog.Logger('test.log',level='debug',backCount=3,when='S',interval=3)
    log.debug('这个是调试信息')
    log.info('这个是标准信息')
    log.warning('这个是告警信息')
    log.error('这个是错误信息')

    time.sleep(1)
测试结果:
test.log.2019-06-28_09-17-33
test.log.2019-06-28_09-17-34
test.log.2019-06-28_09-17-35

8.发送邮件

import  yagmail#原模块有发送邮件中文会乱码的问题,使用的时候用修改后的包

username = '[email protected]'#发送人邮箱
password = 'houyafan123'#授权码,注意不是邮箱密码
smtp = 'smtp.163.com'#SMTP服务器

#1.
mail = yagmail.SMTP(user = username,password=password,host=smtp)

to = ['[email protected]','[email protected]']#发送送人
cc = ['[email protected]']#抄送人
subject = 'say love me !'#邮件标题
contents = '大声告诉自己的男/女朋友,让他/她对你说,他爱你!'#邮件内容
#邮件附件
attachments = [r'/Users/wangxiaoyu/PycharmProjects/python_automated_development/week5/app_student.xls',r'/Users/wangxiaoyu/PycharmProjects/python_automated_development/week5/student.xls']
#2.执行发送
mail.send

9.MD5加密

import hashlib

password = '123456'
m = hashlib.md5(password.encode())#md5加密 ,md5加密是不可逆的,但常见的字符串可以通过撞库所得
print(m.hexdigest())

测试结果:
e10adc3949ba59abbe56e057f20f883e
# 加盐加密
salt = '@#¥%……'#
password = '123456'
content = (password + salt)#密码加盐后的字符串
m = hashlib.md5(content.encode())#md5加盐加密
print(m.hexdigest())

测试结果:
6d0759469c8656aba427f3e77d156f75
#md5加密函数
def str_to_md5(content,salt='#$%^&*('):

    content = str(content) + salt
    m = hashlib.md5(content.encode())
    return m.hexdigest()


print(str_to_md5('123456'))

测试结果:
7ce5039bcc0dfc23b50c601f1d89cef0
import hashlib

password = '123456'
m = hashlib.sha256(password.encode())#sha256加密
print(m.hexdigest())

测试结果:
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
# 加密函数
def str_to_sha256(content):
    content = str(content)
    m = hashlib.sha256(content.encode())
    return m.hexdigest()


with open('加密模块.py',encoding='utf-8') as fr:
    content = fr.read()
    print(str_to_sha256(content))

测试结果:
829efc0268ba73642151909d2ea7ecb7b8bf2a4faadcd58a0fde78a76f3a136c

猜你喜欢

转载自www.cnblogs.com/xyxts/p/11081785.html