zoukankan      html  css  js  c++  java
  • python基础学习5-常用函数模块、操作数据库、发邮件、写日志、写excel

     

    1       函数map和filter

    #map()filter循环帮你调用函数的

    1.1     函数map


    import os

    import time

    def makdir(dir_name):
        if not os.path.isdir(dir_name):
            os.mkdir(dir_name)
            return True
    dir_names = ['android','ios','java','tomcat','python','php']

    res = map(makdir,dir_names)    #循环帮你调用函数
    res1= list(map(makdir,dir_names))
    print(res)      #返回的是一个生成器
    print(res1)     #返回一个list

    def timestampToStr(timestamp=None,format='%Y%m%d'):
        if timestamp:
            time_tuple = time.localtime(timestamp)  #转成时间元组
           
    return time.strftime(format,time_tuple)
        return time.strftime(format)

    all_data = [timestampToStr(int(time.time())-86400*i) for i in range(10)]
    print(all_data)  #这个就是获取到的是一个list

    all_data1 = (timestampToStr(int(time.time())-86400*i) for i in range(10))
    print(all_data1)    #使用小括号获取的是一个生成器
    for a in all_data1:     #循环该生成器也可以获取到对应的数据
       
    print(a)

    #生成器
    #
    生成器为了节省内存的,每次循环的时候,按照这个规则(你写的逻辑)去生成一个数据,但增加了cpu的计算时间
    #
    #
    生成器示例
    nums = (str(i).zfill(2) for i in range(10))
    print(nums)
    for n in nums:
        print(n)

    range(10)       #range函数其实也是一个生成器,在循环的才能获取到对应的数据
    for i in range:
        print(range)

    1.2     函数filter

    #filter作用是过滤,把函数处理结果为假的数据给过滤掉,只保留函数返回真的数据

    def my(num):
        if num%2==0:
            return True
    res = list(filter(my,range(10)))
    res2 = list(map(my,range(10)))
    print('res',res)        #filter作用是过滤,把函数处理结果为假的数据给过滤掉,只保留函数返回真的数据
    print('res2',res2)      #map的作用是不管你返回啥,都给获取到

    2       os模块

    2.1     获取绝对路径

    import os
    print(os.path.abspath('..\day5')) #取绝对路径
    print(os.getcwd())  #取当前路径
    #.
    代表当前目录,..代表上一级目录

    print(os.listdir('D:\pythonscript\day5'))
    os.chdir('D:\pythonscript\day6')      #更改当前工作目录
    print(os.getcwd())


    2.2     system()

    用来执行操作系统命令,但是只能帮你执行,获取不到命令执行的结果

    res = os.system('dir') #用来执行操作系统命令,但是只能帮你执行,获取不到命令执行的结果
    print('res',res)        #如果返回结果是0,表示命令执行成功,返回1表示执行失败



    2.3     popen()

    也是用来执行操作系统命令,但是它可以获取到命令执行的结果
    res = os.popen('dir').read()    #后面添加个read方法就可以获取到命令执行的结果
    print('popen',res)

    此方法只能获取静态的数据,如linux下的要想获取top这个实时动态的数据则无法获取到,要想获取到则通过使用top –n 1来实现获取一次top的数据即可。

    3       datetime

    import datetime
    print(datetime.date.today())        #获取到当天的日期(年月日)
    print(datetime.datetime.today())    #获取到当前的时间(年月日及具体时间)

    t1 = datetime.date.today() + datetime.timedelta(-1)  #获取昨天的数据
    t2 = datetime.date.today() + datetime.timedelta(days=1)   #获取明天的数据,days=可以不加
    print(t1,t2)

    t3 = datetime.datetime.today() + datetime.timedelta(days=1,hours=10,minutes =20,seconds=5) #当前的时间往前或往后推多长时间
    print(t3)
    print(t3.time()) #只取到时间
    print(t3.date())    #只取到日期
    print(t3.timestamp())   #取到时间戳
    print(t3.strftime('%Y-%m-%d'))  #取到格式化时间

    4       random

    import random
    print(random.random())      #取小于1的随机的小数
    print(random.randint(1,10))     #指定范围,取随机的整数,如范围取1-10之间的整数,顾头也顾尾

    s = 'abcd'
    print(random.choice(s))      #随机选择一个,只能选择一个,可以是字符串,list、字典、集合、元组等

    print(random.sample(s,3))   #随机选择N个,返回的是一个list,如3表示随机选择3个,随机选择的不会重复

    print(random.uniform(1,10))     #指定一个范围,然后取一个随机小数

    5       写日志

    import nnlog
    my_log = nnlog.Logger('test1.log',when='S',backCount=5) #when是按天生成文件,将D修改为S则按秒生成文件,backCount备份文件最多只备份5
    #
    日志级别
    #debug
    ,级别最低,打印的信息最详细
    #info
    #warning
    #error
    my_log.debug('debug级别')
    my_log.info('info级别')
    my_log.warning('warning级别')
    my_log.error('error级别')

    6       发邮件

    import yagmail
    #账号密码,邮箱服务器,收件人,抄送人,主题,内容,附件
    username = 'aaaa@126.com'
    passwd = 'bbbb'           #此处需要使用邮箱的授权码,授权码需要在邮件中进行设置
    #smtp_ssl=True  
    安全协议,如果是QQ邮箱需要加上这个参数,网易邮箱可以不加
    mail = yagmail.SMTP(user=username,password=passwd,host='smtp.126.com')         #连上邮箱
    mail.send(to=['aaa@qq.com','bbb@qq.com'],      #发送邮件如果是有多个收件人则直接用list即可
             
    cc='ccc@163.com',
              subject='发送带附件邮件测试',
              contents='邮件发送成功',
              attachments=r'D:pythonscriptday6发邮件.py')    #多个附件写个list即可,如果邮件附件中文乱码的话重新安装一下牛牛修改的whlyagmail包,不是乱码的不用管

    7       操作数据库

    7.1     Mysql数据库

    #连上数据库ip 账号密码,端口号,数据库,执行sql,获取到结果
    import pymysql
    conn = pymysql.connect(host='1.1.1.1',user='jxz',password='123456',port=3306,db='jxz',charset='utf8',autocommit=True)      #连接数据库
    cur = conn.cursor() #建立游标
    # cur.execute('select * from nhy;')     #
    执行sql语句,只是执行sql语句,不会返回数据
    sql = 'insert into nhy (name,pwd) value ("zhangsan","123456");'
    cur.execute(sql)
    # conn.commit()       #执行insertupdatedelete语句时需要提交一下才能插入到数据库中去,否则数据库中没有写入进去,在连接数据库上添加autocommit=True参数可以自动提交,此行就不需要了

    cur.execute('select * from nhy where name="zhangsan";')

    print(cur.fetchall())       #获取数据库执行的所有结果,获取的结果是一个二维的元组
    print(cur.fetchone())       #只获取一条结果
    print(cur.fetchmany(2))     #指定获取几条结果
    #
    如果上面三条都执行,则只有第一条获取到,第二、三条则获取不到东西了,游标类似于文件指针

    cur.close()     #游标关闭
    conn.close()    #连接关闭

    操作数据库封装为一个函数

    def my_db(ip,user,passwd,db,sql,port=3306,charset='utf8'):
        conn = pymysql.connect(host=ip,user=user,
                        password=passwd,db=db,
                        port=port,charset=charset,autocommit=True)
        cur = conn.cursor()
        sql=sql.strip()
        cur.execute(sql)
        sqlstart = sql[:6].lower()      #sql的开头6位,转换为小写
       
    if sqlstart.startswith('select') or sqlstart.startswith('show'):    #判断是selecshow的语句获取对应结果
           
    data = cur.fetchall()
        else:                   #else是为了下面的return不报错
           
    data = 'ok'
       
    cur.close()
        conn.close()
        return data

    7.2     redis数据库

    #传统的关系型数据库(mysqloraclesql serversqlitedb2
        #
    数据存在磁盘上,使用sql语句来操作数据,表与表之间有关系

    #
    非关系型数据库(nosql)mongodb edis
        #
    数据存储是key-value键值对的形式;
        #mogodb
    数据存在磁盘上的
        #redis
    数据都是存在内存里面

    import redis
    r = redis.Redis(host='1.1.1.1',port=6379,password='123456',db=10)    #连接redis
    #
    增删改查
    r.set('jxz_info','name zhangsan age 18 sex nan',50)       #增加数据,第三个参数50是设置过期失效时间,单位是秒

    res = r.get('jxz_info')       #查询数据,获取到的数据前面有个b,表示是bytes二进制数据
    print(res)          #get一个不到的key,不会报错,返回的是None,返回None的话则不能再使用decode()进行编码转换,否则报错
    print(res.decode())     #编码,将二进制转换成字符串

    r.delete('aaaa_info')       #指定一个key删除,删除一个不存在的key不会报错

    print(r.keys())   #获取到所有的key
    print(r.keys('*info'))      #获取以info结尾的key

    print(r.exists('jxz_info'))     #判断这个key是否存在

    print(r.flushdb())      #清空当前数据库里面所有的key

     

    在redis客户端软件上直接执行非关系型数据操作方法:

     

    #hash类型的key增删改查,哈希类型理解为字典嵌套一个字典
    r.hset('session_jxz','aaa','123456')    #增加一个hash类型的key,第一个是外面的key,第二个是里面的key,第三个是value
    r.hset('session_jxz','bbb','000000')
    #修改也是hset

    r.hdel('session_jxz','bbb')     #删除指定的小key
    r.hdel('session_jxz')           #直接删除大key

     

    r.hget('session_jxz','aaa')     #查询指定小key里的数据

    r.hgetall('session_jxz')        #查询指定大key下的所有数据

     

    dic={}
    res = r.hgetall('session_jxz')
    #hash key中获取的数据从bytes类型转换为字符串类型
    #
    方法一:
    for k,v in res.items():
        dic[k.decode()] = v.decode()        #把获取到的keyvaluebyte类型转换为字符串类型;
    print(dic)

    #方法二:
    for k,v in res.items():
        res[k.decode] = res.pop(k).decode()     #能节省内存,因为它把原来的key删掉了
    print(res)



    r.expire('session_jxz',60)      #指定key的失效时间
    print(r.ttl('session_jxz'))

    print(r.type('session_jxz'))    #查看key的类型

    8       加密模块

    import hashlib
    s = '123456'
    m = hashlib.md5(s.encode())         #字符串转换成bytes类型使用encode()方法即可,要将字符串加密,必须传一个bytes类型的数据
    print(m.hexdigest())        #获取到md5加密的结果,md5算法加密是不可逆的

    #
    所有一样的字符串,md5之后的结果都是一样的
    #
    撞库,网上的md5在线解密是用撞库来实现的,是优先将字符串加密的数据与加密前的值放到一个数据库中,在线查询是直接到数据库中去查询

    n = hashlib.sha224(s.encode())
    print(n.hexdigest())

    def mymd5(s):
        str(s)
        m = hashlib.md5(s.encode()) 
        print(m.hexdigest()) 
        return m

    9       写excel

    import xlwt
    book = xlwt.Workbook()      #创建excel
    sheet = book.add_sheet('stu_info')      #加一个sheet
    sheet.write(0,0,'学生编号')    #指定行列,第一个表示行,第二个表示列
    sheet.write(0,1,'学生姓名')
    sheet.write(0,2,'学生成绩')
    sheet.write(1,0,'1')
    sheet.write(1,1,'张三')
    sheet.write(1,2,'98')

    book.save('stu.xls')    #一定要用xls保存

  • 相关阅读:
    webpack devServer配置项的坑
    app混合开发 fastlick.js 在ios上 input标签点击 不灵敏 处理
    vue 学习八 自定义指令
    Verilog数值大小比较
    Verilog实现Matlab的fliplr函数
    基本不等式
    如何读取ila数据
    Xilinx FPGA时钟IP核注意事项
    FPGA Turbo译码器注意事项
    EbN0转SNR
  • 原文地址:https://www.cnblogs.com/better0903/p/9281657.html
Copyright © 2011-2022 走看看