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保存

原文地址:https://www.cnblogs.com/better0903/p/9281657.html