zoukankan      html  css  js  c++  java
  • 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')
     
     
     
  • 相关阅读:
    37. Sudoku Solver(js)
    36. Valid Sudoku(js)
    35. Search Insert Position(js)
    34. Find First and Last Position of Element in Sorted Array(js)
    33. Search in Rotated Sorted Array(js)
    32. Longest Valid Parentheses(js)
    函数的柯里化
    俞敏洪:我和马云就差了8个字
    vue路由传值params和query的区别
    简述vuex的数据传递流程
  • 原文地址:https://www.cnblogs.com/kuhaha/p/9297366.html
Copyright © 2011-2022 走看看