• python之:map、filter、random、datatime,写日志,发邮件,操作mysql、redis,MD5加密,写excel


    1.map、filter

    这两个方法都是帮你调用函数的

    dir_names=['android','ios','tomcat','java','python','php','nginx']

    res=map(makdir,dir_names)  第一个参数是方法名,第二个参数是可循环的值,作用是将可循环值中的每一个元素依次循环传入到方法执行

    print(res)  此时不会打印出结果,因为map调用生成的结果放到生成器中,只有在使用时,才会生成数据放到内存,想要打印出来就把res转换成list,即list(res)

    all=[i for i in range(5)] #结果放到list,占内存,空间换时间(一次得到数据放到内存)

    all=(i for i in range(5)) #结果放到生成器,节省空间,增加了cpu的工作量(每次都要计算一下得到数据),rang()的实现也是一个生成器

    def my(num):
    if num%2==0:
    return True
    res=list(filter(my,range(10))) #返回列表中为真的数据,即range(10)中的数据
    #只保留返回真的数据
    res2=list(map(my,range(10)))
    # 不管返回啥,都拿到
    filter()  过滤,他把函数处理结果为假的数据给过滤掉了,生成结果也是放到生成器
    2.写日志
    import nnlog
    my_log=nnlog.Logger('rizhi.log',level='debug',when='s',backCount=5) #when按什么时间单位生成日志,backcount最多保存几个日志,多余的删除掉。level日志的级别,可不写该参数,默认为bebug
    my_log.debug('debug')  调试信息
    my_log.info('info') 正常输出
    my_log.warning('warning') 警告
    my_log.error('error') 出错
    debug、info、warning、error日志级别依次升高
    3.发送邮件
    import yagmail
    # 账号 密码(只能用邮箱授权码) 邮件服务器(一般都用stmp协议) 收件人 抄送(非必填) 主题 正文 附件(非必填)
    uesername='********@vip.qq.com'
    passwd='zqdlhfeqdnbnbbbe'#授权码,不是邮箱密码
    mail=yagmail.SMTP(user=uesername,password=passwd,host='smtp.qq.com',smtp_ssl=True)
    # 安全协议,smtp_ssl=True如果是qq邮箱需要加这个参数,其他不需要
    mail.send(to='*********@qq.com',cc='********@163.com',subject='qwer',contents='sdf',attachments=r'C:UsersAdministratorDesktop笔记.txt')
    # to 收件人 cc 抄送人 subject 主题 contents 内容 attachments 附件内容 多个时都是用列表的形式写出
    # 如果你发送的附件名,中文时乱码的话
    # pip uninstall yagmail,卸载掉,换个新的装一下
    4.操作mysql
    # 1.连接数据库:需要 ip 账号 密码 端口号 数据库名称
    # 2.执行sql
    # 3.获取到结果
    import pymysql
    conn=pymysql.connect(host='***.***.***.***',user='***',password='123456',port=3306,db='***',charset='utf8',autocommit=True)#连接数据库,加上autocommit=True 可以直接对数据库进行修改,其中port是int类型,注意不要加引号
    cur=conn.cursor(cursor=pymysql.cursors.DictCursor)#建立游标,类似于仓库管理员。括号里指定了数据的返回类型,没有值时,默认返回二维元组
    sql="insert into nhy(name,pwd) VALUE ('jc','123456')"
    cur.execute(sql)
    conn.commit() #对数据库修改操作时,需要进行commit
    cur.execute("select * from nhy where name='jc'")
    # cur.execute('select * from nhy;') #执行sql语句,只是帮你执行sql语句,不会帮你返回结果
    print(cur.description) #获取表的信息
    fileds=[filed[0] for filed in cur.description] #列表生成式,获取到所有的字段
    print(cur.fetchall()) #获取所有结果,结果存放到二维元组当中
    # print(cur.fetchone()) #只获取一条数据
    # print(cur.fetchmany(2))#指定获取几条
    # 前边结果被获取过了,后边结果就不能再被获取了
    cur.close() #游标关闭
    conn.close() #连接关闭

    以下为操作mysql数据库的封装函数,可以直接拿来用
    def my_db(ip,user,passwd,db,sql,port=3306,charset='utf8'):
    coon=pymysql.connect(host=ip,user=user,password=passwd,db=db,port=port,charset=charset,autocommit=True)
    cur=coon.cursor()
    sql=sql.strip()
    cur.execute(sql)
    sql_start=sql[:6].lower() #取sql的开头,然后转化成小写的
    if sql_start.startswith('select') or sql_start.startswith('show'):
    data=cur.fetchall()
    else:
    data='ok'
    cur.close()
    coon.close()
    return data

    5.操作redis
    #传统的关系型数据库
    # mysql oracle sql server sqllie db2
    # id name passwd cratetime stu
    # score
    #数据存在磁盘上
    # 使用sql语句来操作数据
    # 表与表之间有关系
    #非关系型数据库 nosql
    # {'name':'xxx',''}
    # mongodb 数据存在磁盘上的
    # redis 数据都是存在内存里面

    import redis
    #连接redis
    r = redis.Redis(host='***.***.***.***',port=6379,password='****',db=10)
    #增删改查
    #操作string类型
    # r.set('nhy_info','age 18 sex nan sdfsdfsdfsd') #增加、修改数据,传入第三个参数时,表示key的失效时间,不设置或者为-1时,代表永久生效
    # res = r.get('nhy_info') #获取数据,得到bytes类型的数据,key不存在的话,不报错,返回none
    # bytes#二进制
    # r.delete('nhy_info') #指定一个key删除他,key不存在的话,不报错
    # print( res.decode() ) #编码,bytes就变成了字符串
    # print(r.keys('*info')) #获取到所有的key
    # print(r.exists('dashu_name')) #判断这个key是否存在
    # r.flushdb()#可以清空当前数据库里面所有的key
    # r.expire('session_crm',600)#指定key的失效时间
    # print(r.ttl('session_crm'))#用来这个key的失效时间
    # print(r.type('session_crm'))#看key的类型
    #hash 哈希类的key

    #哈希类型你理解为一个字典嵌套字典
    # redis的命令行里面select 8 就是切换数据库
    # 操作hash类型的
    #增删改查
    r.hset('fdfds','sasa','trtrsasae')
    r.hset('fdfds','cxcx','hghghg')
    r.hset('fdfds','fdfdf','trtre')
    # 修改也是hset
    # r.hdel('fdfds','sasa') #删除指定的小key
    # r.delete('fdfds') #直接删除大key
    # print(r.hget('fdfds','cxcx'))#获取指定小key里面的数据
    res = r.hgetall('fdfds')#获取到hash类型里面所有的数据,存在字典里,但k和v都是bytes类型的,需要转换为字符串类型,这里就需要用.decode()方法
    a = {}
    for k,v in res.items():
    a[k.decode()] = v.decode()
    print(a)

    以下是封装好的redis操作模块,以后可以直接拿来用:
    import redis
    def op_str(k,v=None,t=None,ip='118.24.3.40', port=6379, passwd='HK139bc&*', db=10):
    r=redis.Redis(host=ip, port=port, password=passwd, db=db)
    if v:
    r.set(k, v)
    data='ok'
    else:
    if r.exists(k):
    res=r.get(k)
    data=res.decode()
    else:
    data='结果不存在'
    return data

    def op_hash(k1,k2=None,v=None,ip='118.24.3.40', port=6379, passwd='HK139bc&*', db=10):
    r=redis.Redis(host=ip, port=port, password=passwd, db=db)
    if k2:
    if v:
    r.hset(k1, k2, v)
    res='ok'
    else:
    if r.hget(k1, k2):
    res = r.hget(k1, k2).decode()
    else:
    res='结果不存在'
    else:
    if r.exists(k1):
    a = r.hgetall(k1)
    res = {}
    for k, v in a.items():
    res[k.decode()] = v.decode()
    else:
    res='结果不存在'
    return res


    6.MD5加密
    import hashlib
    s='123456'
    m=hashlib.md5(s.encode()) #必须传一个btyes类型的,后边加.encode()
    print(m.hexdigest()) #获取到加密之后的结果
    #MD5不可逆,不可解密
    # 所有一样的字符串,MD5加密之后的结果都是一样的
    # 撞库来实现MD5解密的

    以下是封装好的MD5加密模块,以后可以直接拿来用:
    def myMd5(s):
    s = str(s)
    m = hashlib.md5(s.encode()) #必须得传一个bytes类型的
    return m.hexdigest()

    加盐:当密码很容易被破解时,可以使用加盐方法,即在密码前后加上固定字符串,加上用户名之类的值,作为密码,再进行MD5加密,这样更加安全
    7.写excel
    import xlwt
    book=xlwt.Workbook() #创建excel
    sheet=book.add_sheet('1') #加一个sheet页
    sheet.write(0,0,'学生编号') #行,列
    book.save('ss.xls') #一定要以xls结尾

    8.读excel
    xlwt #只能写excel
    import xlrd #只能读
    book = xlrd.open_workbook('nhy.xls') 打开指定的excel
    print(book.nsheets)#获取到excel里面总共有多少个sheet页
    sheet = book.sheet_by_index(0) 指定操作第几个sheet页
    book.sheet_by_name('sheet1') 指定操作那个sheet页
    # print(sheet.cell(0,0).value) #指定行和列,获取某个单元格里面的内容
    # print(sheet.cell(1,0).value)
    print(sheet.row_values(0))#获取某一行的数据
    print(sheet.row_values(1))#获取某一行的数据
    print(sheet.nrows)#这个就是excel里面总共有多少行
    print(sheet.col_values(0))#某一列的数据
    print(sheet.col_values(1))#某一列的数据
    print(sheet.ncols)#总共有多少列
    9.修改excel
    import xlrd
    from xlutils import copy
    book1=xlrd.open_workbook('shuipingzuo.xls')
    # 打开原来的excel
    new_book=copy.copy(book1)
    # 拷贝一个新的excel
    sheet=new_book.get_sheet(0)
    # 获取第一个sheet页
    sheet.write(1,3,18)
    new_book.save('shuipingzuo.xls')
     
     
     
  • 相关阅读:
    Linux命令:head
    Linux命令:less
    分布式锁的实现(java)
    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。(转载)
    SpringBoot实现热加载方式
    报表设计细节
    Pentaho Report Designer 数据大于某值显示红色
    Centos7更改yum源与更新系统
    Centos7安装配置NFS服务和挂载
    centos7上搭建ftp服务器(亲测可用)
  • 原文地址:https://www.cnblogs.com/kuhaha/p/9297366.html
Copyright © 2020-2023  润新知