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 Truedir_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 Trueres = 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
#errormy_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:\pythonscript\day6\发邮件.py') #多个附件写个list即可,如果邮件附件中文乱码的话重新安装一下牛牛修改的whl的yagmail包,不是乱码的不用管
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() #执行insert、update、delete语句时需要提交一下才能插入到数据库中去,否则数据库中没有写入进去,在连接数据库上添加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'): #判断是selec或show的语句获取对应结果
data = cur.fetchall()
else: #加else是为了下面的return不报错
data = 'ok'
cur.close()
conn.close()
return data
7.2 redis数据库
#传统的关系型数据库(mysql\oracle\sql server\sqlite\db2)
#数据存在磁盘上,使用sql语句来操作数据,表与表之间有关系
#非关系型数据库(nosql)(mongodb\redis)
#数据存储是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()) #获取到所有的keyprint(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,第三个是valuer.hset('session_jxz','bbb','000000')
#修改也是hset
r.hdel('session_jxz','bbb')
#删除指定的小keyr.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() #把获取到的key和value的byte类型转换为字符串类型;
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() #创建excelsheet =
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保存