python 常见错误和异常 函数 正则表达式及多线程编程

生成随机密码
#!/usr/bin/env python

import string
from random import choice

def gen_pass(num=9):
all_chs = string.letters + string.digits
pwd = ''

for i in range(9):
pwd += choice(all_chs)
return pwd

if __name__ == '__main__':
print gen_pass (4)
print gen_pass ()
——————————————————————————————————————————————————————————

python错误和异常
错误
从软件方面来说,错误是语法上或逻辑上的
语法错误只是软件上的结构上有错误,导致不能被解释器解释或编译器无法编译
这些错误必须在程序执行钱纠正
逻辑错误可能是由于不完整或是不合发的输入所致,还可能是逻辑无法生成,计算
或是输出结果需要过程无法执行
异常
当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下棋
这时候就出现了异常,异常是因为程序出现了错误而在正常控制流以外采取的行为
这个行为又分为两个阶段,首先是引起异常发生的错误然后是检测阶段

异常
NameError:未声明/初始化对象
IndexError:序列中没有此索引
SyntaxError:语法错误
KeyboardInterrupt:用户中断执行
EOOFError:没有内建输入,到达EOF标记
IOError:输入/输出操作失败

检测和处理异常
try-excep语句
定义了进行异常监控的一段代码,并且提供了处理异常的机制
try:
try_suite(监控这里的异常)
except Exception[,reason]:
excep_suite(异常处理代码)
#!/usr/bin/env python
示例:
try:
num = int(raw_input('number:'))
result = 100 /num
print result
except ValueError:
print 'Invalid operation.'
带有多个expect的try语句
可以把多个except语句链接在一起,处理一个try块中可能发生的多种异常
#!/usr/bin/env python

try:
data = int(raw_input('input a number:'))
except KeyboardInterrupt:
print 'user cancelled.'
except ValueError:
print 'you must input a number!'
else:
print data
finally:
print 'done.'

触发语句
raise语句:
要想引发异常,最简单的形式就是输入关键字raise,后面要跟要引发的异常的名称
执行raise语句时,python会创建制定的异常类的一个对象
raise语句还可可以指定对异常对象进行初始化的参数
断言:
断言是一句必须等价于布尔值为真的判定,此外,发生异常也意味者表达式为假
实例:
!/usr/bin/env python

def set_age(name,age):
if not 1 <+ age < 150:
raise ValueError, 'age out of range.'(raise语句)
print '%s is %s years old.' % (name,age)
def set_age2(name,age):
assert 1 <= age <150, 'age out of range.'(断言)
print '%s is %s years old.' % (name,age)

if __name__ == '__main__':
set_age('hydra',20)
set_age2('alice',200)

——————————————————————————————————————————————————————————————————

re模块
match函数
尝试用正则表达式模式从字符串的开头匹配,如果匹配成功则返回一个匹配对象
否则返回none
>>> import re(导入模块)
>>> re.match('foo','food')(匹配成功)
<_sre.SRE_Match object at 0x7fa02fd06b90>
>>> print re.match('foo','seafood')(匹配失败)
None
search函数
在字符串中查找正则表达式的第一次出现,如果匹配成功则返回一个匹配对象
否则返回None
>>> m = re.search('foo','seafood')
>>> print m
<_sre.SRE_Match object at 0x7fa02fd06bf8>
group方法
使用match或search匹配成功后,返回的匹配对象可通过group方法获得匹配内容
>>> print m.group()
foo

compile函数
对正则表达式模式进行编译,返回一个正则表达式对象
不是必须要用这种方式,但是可在大量匹配的情况下可以提升效率
>>> patt = re.compile('foo')
>>> m = patt.match('food')
>>> print m.group()
foo
split方法
根据正则表达式中的分割符把字符分割为一个列表,并返回成功匹配的列表
字符串也有类似的方法,但是正则表达式更加灵活
>>> import re
>>> mylist = re.split('\.|-','hello-word.data')(使用.和- 作为字符串的分割符)
>>> print mylist
['hello', 'word', 'data']

sub方法
把字符串中所有匹配正则表达式的地方替换成新的字符串
>>> print re.sub('x','mr.smith', 'hi, x.\nNice to meet you x')
hi, mr.smith.
Nice to meet you mr.smith
——————————————————————————————————————————————————————

正则表达式

匹配单个字符
.:匹配任意字符(换行符除外)
[...x-y...]:匹配字符组里的任意字符
[^...x-y...]:匹配不在字符组里的任意字符
\d:匹配任意数字
\w:匹配任意数字 字母 字符
\s:匹配空白字符与[\r\v\f\t\n]同义

匹配一组字符
literal:匹配字符串的值
re1|re2:匹配正则表达式re1或re2
*:匹配前面出现的正则表达式零次或多次
+:匹配前面出现的正则表达式一次或多次
?:匹配前面出现的正则表达式零次或一次
{M,N}:匹配前面出现的正则表达式至少M次最多N次

其他元字符
^:匹配字符串的开始
$:匹配字符串的结尾
\b:匹配单词的边界
():对正则表达式分组
\nn:匹配已保存的子组

贪婪匹配
* , + 和?都是贪婪匹配操作符,在其后加上?可以取消其贪婪匹配行为
正则表达式匹配对象通过groups函数获取子组
>>> data = 'you phone number is: 1520029989'
>>> m = re.search('.+(\d)', data)
>>> m.group()
'you phone number is: 1520029989'

实例:编写一个apache日志分析脚本
#!/usr/bin/env python

import re

def count_patt(fname,patt):
cpatt = re._compile(patt)
result = {}
with open(fname) as fobj:
for line in fobj:
m = cpatt.search(line)
if m:
key = m.group()
result[key] = result.get(key,0) + 1
return result
if __name__ == '__main__':
http_log = '/var/log/httpd/access_log'
ip_addr = '(\d+\.){3}\d+'
br_patt = 'Firefox|MSIE'
print count_patt(http_log,ip_addr)
print count_patt(http_log,br_patt)
——————————————————————————————————————————————————————————————————

多线程
在多线程(MT)编程出现之前,电脑程序的运行由一个执行序列组成执行序列在主机的中央处理器中运行
无论是任务本身要求顺序执行还算整个程序是由多个子任务组成,程序都是按照这种方式执行的
即使子任务相互独立,无相无关时也是这样
如果运行这些相互独立的子任务可以大幅度地提升整个任务的效率
他们本质就是异步的,需要有多个并发事物
各个事物的运行顺序可以是不确定的,随机的
这样的编程任务可以被分成多个执行流,每个流都有一个要完成的目标
根据应用的不同,这些子任务可能要计算出一个中间结果,用于合并得到最后的结果
线程一般是并发执行的,正是由于这种并行和数据共享机制使得多个任务的合作变为可能
需要注意的是,在单个cpu的系统中,真正的并发是不可能的
每个线程会被安排成每次之运行一小会,然后就把cpu让出来,让其他线程去运行

多线程编程
thread和threading模块允许程序员创建和管理线程
thread模块提供了基本的线程和锁的支持,而threading提供了更高级别,功能更强的线程管理功能
推荐使用更高级别的threading模块

实例:编写多线程扫描192.168.4.0网段的存活主机

#!/usr/bin/env python

import subprocess
import threading

def ping(host):
result = subprocess.call(
"ping -x2 %s &> /dev/null" % host, shell=True

)
if result == 0:
print "%:up" % host
else:
print "%s:down" % host
if __name__ == '__main__':
ips = ['192.168.4.%s' %i for i in range(1,255)]
for ip in ips:
t = threading.Thread(target=ping,args=[ip])
t.start()
————————————————————————————————————————————————————————————————

paramiko模块

安装paramiko模块(安装后重启pycharm)
[root@room1pc01 ~]# yum -y install gcc gcc-c++ python-paramiko

实例:编写多线程链接多主机执行命令
#!/usr/bin/env python

import sys
import paramiko
import os
import getpass
import threading

def remote_comm(host,pwd,comm):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
ssh.connect(host,username='root',password=pwd)
stdin, stdout, sterr = ssh.exec_command(comm)
out = stdout.read()
err = sterr.read()
if out:
print "[%s]out:\n%s" % (host, out)
if err:
print "[%s]error:\n%s" % (host, err)
ssh.close()

if __name__ == '__main__':
if len(sys.argv) !=3:
print "usage: %s ipfile 'command'" % sys.argv[0]
sys.exit(1)
if not os.path.isfile(sys.argv[1]):
print "no such file:", sys.argv[1]
sys.exit(2)

ipfile = sys.argv[1]
comm = sys.argv[2]
passwd = getpass.getpass("passwoed: ")

with open(sys.argv[1]) as fobj:
for line in fobj:
ip = line.strip()
t = threading.Thread(
target=remote_comm,args=(ip, passwd, comm)
)
t.start()

[root@room1pc01 ~]# python ssh.py ipaddr.txt ls/root/(执行脚本 ip地址池 执行的命令)

posted @ 2017-10-10 18:24  Hydraxx  阅读(620)  评论(0编辑  收藏  举报