Python自动化--语言基础7--操作日志、加密、发送邮件、线程、生产者消费者
1、操作日志
logging.basicConfig:日志的统一处理器,对日志的输出格式和方式做配置
日志级别等级CRITICAL > ERROR > WARNING > INFO > EDBUG
level设定级别以及以上级别的才会打印,这里注意大小写!
打印日志信息在控制台或输出在一个文件示例:
1 import logging
2 import os
3
4 # log_file = os.path.join(os.getcwd(),'wlog.log')
5 log_format = "%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s: %(message)s"
6 '''
7 如果不写filename和filemode参数则默认打印到console
8 '''
9 logging.basicConfig(level=logging.WARNING,format=log_format)
10 # logging.basicConfig(level=logging.WARNING,format=log_format,filename=log_file,filemode='w')
11
12 logging.warning("waring message")
13 logging.error("error message")
输出在控制台信息如下:
2017-03-20 21:41:07,756 3.19.py [line:24] WARNING: waring message
2017-03-20 21:41:07,756 3.19.py [line:25] ERROR: error message
同时在控制台和输出到文件代码示例:
1 # 创建一个logger
2 logger = logging.getLogger("mylogger")
3 logger.setLevel(logging.INFO)
4
5 # 创建一个handler,将log写入文件中
6 fh = logging.FileHandler('D:/pycharm workspace/practice/log.txt','a')
7 fh.setLevel(logging.INFO)
8
9 # 再创建一个handler,将log输出在控制台
10 ch = logging.StreamHandler()
11 ch.setLevel(logging.CRITICAL)
12
13 # 设置输出格式
14 log_format = "%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s: %(message)s"
15 formatter = logging.Formatter(log_format)
16 fh.setFormatter(formatter)
17 ch.setFormatter(formatter)
18
19 #把handler添加到logger里,其实可以理解为汇报给大领导
20 logger.addHandler(fh)
21 logger.addHandler(ch)
22
23 logger.error("今天天气阴")
控制台设置为CRITICAL不会有输出,因为打印的是error信息
输出到文件设置为INFO,打印的是error信息,会输出在文件中
如果设置成不一样的实际是没有任何意义。一般都设置为INFO。
另:
将执行脚本的日志保存在一个文件中
1 dirfile = os.listdir("D:\\")
2 for i in dirfile:
3 s=i.split('.')[1]
4 print(s)
5 if s == "py":
6 os.system("D:\\%s 1>>log.txt 2>&1" %i)
2、加密
#DES加密
# pyDes.des(key,[mode],[IV],[pad],[pdamode])
# 参数的意思分别如下:
# key:加密密钥,长度为8位。必选
# mode:加密方式。ECB(默认)、CBC(安全性好于前者)
# IV:初始字节数(长度为8位),如果选择的加密方式为CBC必须有这个参数。否则可以没有
# pad:加密时,将该字符添加到数据块的结尾;解密时,将删除从最后一个往前的8位
# padmode:PAD_NORMAL、PAD_PKCSS,当选择前者时必须设置pad
md5、sha、des加密代码示例:
1 import hashlib #md5 sha
2 import base64 #des
3 from pyDes import *
4
5 def md5_encode(data):
6 m = hashlib.md5()
7 m.update(data.encode('utf-8'))
8 return m.hexdigest() #经过特殊处理之后以字符串形式返回
9
10 def sha1_encode(data):
11 sha1 = hashlib.sha1()
12 sha1.update(data.encode('utf-8'))
13 return sha1.hexdigest()
14
15 def des_encode(data):
16 k = des("xqtest66",padmode=PAD_PKCS5)
17 # k = des('xqtest66',CBC,'goodluck',pad='hahahaha',padmode=PAD_NORMAL)
18
19 #encrypt来加密我的数据,然后进行base64编码
20 encodeStrr = base64.b64encode(k.encrypt(data))
21 return encodeStrr
22
23 data = "wo"
24 print('md5加密结果:',md5_encode(data))
25 print('sha加密结果:',sha1_encode(data))
26 print('des加密结果:',des_encode(data))
3、发送邮件
1 import smtplib
2 import email.mime.multipart
3 import email.mime.text
4
5 from email.mime.application import MIMEApplication
6
7 class SendMail:
8 def send_mail(self,title):
9 msg = email.mime.multipart.MIMEMultipart() #生成包含多个邮件体的对象
10 msg['from'] = 'jiayan****@126.com'
11 msg['to'] = '5478987@qq.com'
12 msg['subject'] = title
13 content = '''
14 这是邮件的正文部分
15 '''
16
17 #邮件正文
18 txt = email.mime.text.MIMEText(content)
19 msg.attach(txt)
20
21 #excel附件
22 # xlsxpart = MIMEApplication(open('send_mail_excel.xlsx', 'rb').read())
23 # xlsxpart.add_header('Content-Disposition', 'attachment', filename='send_mail_excel.xlsx')
24 # msg.attach(xlsxpart)
25
26 #jpg图片附件
27 jpgpart = MIMEApplication(open('Aaron.png', 'rb').read())
28 jpgpart.add_header('Content-Disposition', 'attachment', filename='Aaron.png') #需要图片文件在代码相应的目录下
29 msg.attach(jpgpart)
30
31 #发送邮件
32 smtp=smtplib
33 smtp=smtplib.SMTP()
34 smtp.set_debuglevel(1) #设置为调试模式,console中显示
35 smtp.connect('smtp.126.com','25') #链接服务器,smtp地址+端口
36 smtp.login('jiayan****@126.com','Jiaxxxxxxxx') #登录,用户名+密码
37 smtp.sendmail('jiayan****@126.com','5478987@qq.com',str(msg)) #发送,from+to+内容
38 smtp.quit()
39
40 mail = SendMail()
41 mail.send_mail('python自动化测试')
查找最进时间修改的文件,代码如下:
1 os.path.listdir #以列表的形式展示文件
2 os.path.getmtime #最后修改的时间
3 os.path.join #路径拼接
4
5 import os
6 filenames = "D:\\pycharm workspace\\appiumframework\\report"
7 lists = os.listdir(filenames)
8 print(lists)
9 lists.sort(key=lambda fn:os.path.getmtime(filenames+"\\"+fn))
10 print(lists[-1])
11 file = os.path.join(filenames,lists[-1])
12 print(file)
4、进程与线程的区别:
进程不共享空间,线程共享地址空间 线程共享空间优缺点:
优点:多线程给用户的体验好些,处理速度快些
缺点:共享地址空间相互影响
import threading
import time class Mythreading(threading.Thread):
def __init__(self,threadID,name,counter):
threading.Thread.__init__(self) #固定格式
self.threadID = threadID
self.name = name
self.counter = counter
print("初始化完成")
def run(self): #由cpu来处理决定线程间的执行顺序
print("开始"+self.name)
print_time(self.name,self.counter,5)
print("结束"+self.name) def print_time(threasName,counter,delay):
while counter:
time.sleep(delay)
print("%s:%s"%(threasName,time.ctime(time.time())))
counter -= 1 #创建线程
thread1 = Mythreading(1,"thread1",1)
thread2 = Mythreading(2,"thread2",2) #开启线程
thread1.start()
thread2.start()
import threading
import time class Mythreading(threading.Thread):
def __init__(self,threadID,name,counter):
threading.Thread.__init__(self) #固定格式
self.threadID = threadID
self.name = name
self.counter = counter
print("初始化完成")
def run(self): #由cpu来处理决定线程间的执行顺序
threadLock.acquire() #获得锁,成功获得锁定后返回True,可选的参数timeout不填时将一直阻塞直到获得锁定
print_time(self.name,self.counter,3)
threadLock.release() #释放锁,开始下一个线程 def print_time(threasName,counter,delay):
while counter:
time.sleep(delay)
print("%s:%s"%(threasName,time.ctime(time.time())))
counter -= 1 threadLock = threading.Lock()
threads = [] #创建线程
thread1 = Mythreading(1,"thread1",1)
thread2 = Mythreading(2,"thread2",2) #开启线程
thread1.start()
thread2.start() # thread1.join()
# thread2.join()
threads.append(thread1)
threads.append(thread2)
for t in threads:
t.join() #后边的代码必须等待,等线程运行完成才会往后运行代码 print("我的的花儿也谢了")
为什么下图左为串行,下图右为并行运行呢?

图左love启动后分别执行start和join,启动了join后边代码就需要等待前边代码运行完成。总共18s
图右同时启动love和hate,运行所需要执行的时间然后停止。总共10s
超级播放器示例,如下:
import threading
from time import sleep, ctime
def music(func):
for i in range(2):
print ("I was listening to %s! %s" %(func,ctime()))
sleep(4)
def move(func):
for i in range(2):
print ("I was at the %s! %s" %(func,ctime()))
sleep(5) def player(name):
r = name.split('.')[1]
if r=="mp3":
music(name)
elif r=="mp4":
move(name)
else:
print("%s is error!"%name) lists = ["love.mp3","hate.mp4","cuicui.mp3","nnnn.mp4"] threads = []
files = range(len(lists))
for i in files:
t = threading.Thread(target=player,args=(lists[i],))
threads.append(t) if __name__ == '__main__':
for i in files:
threads[i].start()
for i in files:
threads[i].join()
print ('all end: %s' %ctime())
5、生产者与消费者示例:
import threading
class Produce(threading.Thread): def __init__(self,name):
threading.Thread.__init__(self)
self.name = name
def run(self):
global x
tt.acquire()
if x > 0 : print("我不生产了")
else:
for i in range(5):
x += 1
print("%s在生产中,第%d个"%(self.name,x))
tt.release() class Consume(threading.Thread):
def __init__(self,name):
threading.Thread.__init__(self)
self.name = name
def run(self):
global x
tt.acquire()
if x == 0: print("我不消费了")
else:
for i in range(5):
x -= 1
print("%s在消费中,第%d个"%(self.name,x+1))
tt.release()
x = 0
tt = threading.Lock()
# tt = threading.Condition p = Produce("produce")
c = Consume("consume") p.start()
c.start() p.join()
c.join()
Python自动化--语言基础7--操作日志、加密、发送邮件、线程、生产者消费者的更多相关文章
- Python自动化--语言基础6--模块操作之re、MySQL、Excel
1.Python自有模块正则 import re # re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None print(re.match("aaa ...
- Python自动化--语言基础4--模块、文件读写、异常
模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...
- python自动化--语言基础四模块、文件读写、异常
模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...
- Python自动化--语言基础8--接口请求及封装
基于http协议,最常用的是GET和POST两种方法. 接口文档需要包含哪些信息: 接口名称接口功能接口地址支持格式 json/xml请求方式请求示例请求参数(是否必填.数据类型.传递参数格式)返回参 ...
- Python自动化--语言基础5--面向对象、迭代器、range和切片的区分
面向对象 一.面向对象代码示例: 1 class Test(): #类的定义 2 car = "buick" #类变量,定义在类里方法外,可被对象直接调用,具有全局效果 3 def ...
- Python自动化--语言基础3--字典、函数、全局/局部变量
字典 dict1 = {'name':'han','age':18,'class':'first'} print(dict1.keys()) #打印所有的key值 print(dict1.values ...
- Python自动化--语言基础2--运算符、格式化输出、条件语句、循环语句、列表、元组
运算符包括:算术运算符.比较运算符.赋值运算符.逻辑运算符.成员运算符.身份运算符 算术运算符 % 取模(余数) // 取相除的整数部分 / (5/2=2.5) 比较运算符 == 等于 ! ...
- python自动化--语言基础1--数据类型及类型转换
Python中核心的数据类型有哪些?变量(数字.字符串.元组.列表.字典) 什么是数据的不可变性?哪些数据类型具有不可变性数据的不可变是指数据不可更改,比如: a = ("abc" ...
- python自动化--语言基础五面向对象、迭代器、range和切片的区分
面向对象 一.面向对象简单介绍: class Test(): #类的定义 car = "buick" #类变量,定义在类里方法外,可被对象直接调用,具有全局效果 def __ini ...
随机推荐
- 苹果新贵 Swift 之前世今生
摘要 : 做为一个70后程序员,克里斯先后发明了 LLVM.Clang 和 Swift,请问你做了什么? 上 周出差劳顿,这篇文章几次动笔都未完成,常常躺倒床上就昏睡过去.南方的天气闷热潮湿,让我 ...
- SVN的安装和配置
SVN为程序开发团队常用的代码管理,版本控制软件:下面我们来介绍TortoiseSVN的安装,和其服务器的搭建:(下面为windows 64位系统下的搭建) 闲来无事,就在本地搭建了一个SVN环境,网 ...
- Centos硬盘IO性能检测命令iostat[转]
Centos硬盘IO性能检测命令iostat[转] 在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都 ...
- _0_web_基础
创:18_3_2017修:20_3_2017 什么是前端? --在浏览器中展示内容以及处理请求 什么是浏览器? --一款能将网页内容展现给用户查看,并且让用户与网页交互的软件 什么是内核? --渲染引 ...
- 如何去掉ul标签的多余空白或多余大距离?
在css中写入 ul{ margin:; padding:; list-style: none; } 让其内边距和外边距为0,列表样式为空
- JavaScript中事件绑定的三种方式
JavaScript使得网页与用户友好交互,在使用 js 进行时间绑定的时候有三种绑定方式. 第一种:初学者以及普通写法 <div id="dom0"> <inp ...
- lambda高级进阶--组合函数
只有一个参数的函数可以将一个值转换成另一个值,如果你有2个这样的转换函数,那么在进行一个转换之后在进行第二个转换,其实也是一个中转换. 说到这里,先说一下我个人的一个习惯,我在写javaBean的se ...
- php中HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR的使用
1.REMOTE_ADDR:浏览当前页面的用户计算机的ip地址2.HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关3.HTTP_CLIENT_IP:客户端的ip 在PHP 中 ...
- MyEclipse中好用的快捷键汇总
MyEclipse中常用的快捷键有很多,合理的使用其中一些快捷键组合,可以有效提高开发的效率和质量. 1.Ctrl + Shift + R:打开资源.可以查找并打开工作区中任何一个文件,且支持使用通配 ...
- redis数据类型-集合类型
集合类型 在集合中的每个元素都是不同的,且没有顺序. 一个集合类型(set)键可以存储至多2 32-1个(相信这个数字对大家来说已经很熟悉了)字符串. 集合类型的常用操作是向集合中加入或删除元素.判断 ...