#########异常处理######
#!/usr/bin/env python
#coding:utf-8
_author_ = 'hxr'
##python的异常处理机制,try ... expect.... finally....
try: ##用来把可能存在异常的代码放在该语句块中print 'starting...'
li=[1,2,3]
dic={'name':'hello'}
print dic['hello']
print li[3]
print a ##NameError
except BaseException,e : ##不确定错误种类是哪种,使用父类方法来捕获异常
print e
# except IndexError: ##捕获指定的异常,如果异常为IndexError,则执行下面的语句
# print 'index out of list length'
# except NameError:
# print 'name is not define'
else: ##没有任何异常则执行下面的语句
print 'no error'
finally: ##无论是否存在异常,均会执行以下语句
print 'end...'
####函数中出现的异常
def fun1(s):return fun2(s)*2
def fun2(s):
return 10/s
def main():
try:
print fun1('10')
except BaseException,e: ##错误类型为TypeError
print e
main()
运行结果:
unsupported operand type(s) for /: 'int' and 'str'
####将异常写入文件中
import logging ##导入模块(将错误写入到对应文件中)logging.basicConfig(filename='err.log') ##建立对应文件
def fun1(s):
return fun2(s)*2
def fun2(s):
return 10/s
def main():
try:
print fun1('10')
except Exception as e:
logging.exception(e) ##将错误信息写入文件中
print e
main()
####自定义错误类型
class MyError(BaseException): ##自定义的错误类型pass
def fun1(s):
return fun2(s)*2
def fun2(s):
return 10/int (s)
def main():
try:
print fun1('0')
except ZeroDivisionError as e:
raise MyError ##更改错误名称
print e
main()
####调试
-print 打印出你认为可能出错的变量-assert 断言,格式
assert 变量名==值[不符合预设条件时执行的语句]
def foo(s):
n = int(s)
return 10 / n
assert foo(5) == 1 ##错误就结束,正确就接着执行
print 'hello'
####记录错误信息级别并输出到文件中
import logging##debug ,info,warning,error 指定记录信息的级别
logging.basicConfig(filename='logging.log',level=logging.WARNING)
def foo(s):
n = int(s)
logging.info('n=%d'%n) ##对应级别写入文件中
logging.warning('n=%d,,,,,warn'%n)
return 10 / n
def main():
foo('10')
main()
####pdb 调试方法
在命令行中执行
python -m pdb error.py ##进入调试
n(下一步,单步执行)
p 变量名 (查看变量)
q(退出)
c(继续执行,直到遇到断点)
####pdb断点调试
import pdb
n=1
print n
pdb.set_trace() ##设置断点
print 'hello'
pdb.set_trace() ##设置断点
print 'world'
s=2
print s
在命令行中执行
python error.py ##进入调试
################正则表达式############
基本模式• 字面模式: 就是字面长量,就代表其本身
• . 匹配任何字符
• \w 匹配一个单词(字母,数字) \W 匹配非字母
• \s 匹配空白 \S 匹配非空白字符
• \d 匹配数字
• ^ 开头 $ 结尾
• \ 转义字符
次数的匹配
次数的匹配 , 匹配其前面的字符出现的次数 :
• * 0 次或多次
• + 一次或多次
• ? 零次或一次
• {n} 出现 n 次
• {m,n} 出现 m 到 n 次
中括号
• 中括号用于指向一个字符集合
• 中括号可以使用元字符
• 中括号中的. 表示其字面意思
[a-z] [A-Z] [0-9] [A-Za-z]
• [0-9a-zA-Z\_] 可以匹配一个数字、字母或者下划线;
• [0-9a-zA-Z\_]+ 可以匹配至少由一个数字、字母或者下划线组成的字
符串;
• [a-zA-Z\_][0-9a-zA-Z\_]{0, 19} 更精确地限制了变量的长度是 120
个字符;
•A|B 可以匹配 A 或 B
•^\d 表示必须以数字开头
• \d$ 表示必须以数字结束
#######判断邮件名是否合法#####
#!/usr/bin/env python#coding:utf-8
_author_ = 'hxr'
import re
r= r'\w+@.+[\.cn|\.com]$' ##规则的定义,实现判断邮件名称是否合法
s='heo@ewiqeh.cn'
print re.findall(r,s)
r1=r'^[0-9]{3}\-[0-9]{7}' ##规则,判断电话号码是否合法
s='029-1234567'
print re.findall(r1,s)
#########re模块#######
• re.match(p,text) :p 为正则表达式模式, text 要查找的字符串,会返回一个match 对象• re.search(p,text) : 只要在 text 中匹配到了 p 就返回,只返回第一个匹配到的
• re.findall(p,text) :将能匹配上的全返回,会返回一个 list
• re.split(p,text) : 按照 p 匹配,并且以匹配到的字符为分隔符切割 text, 返回一个切割后的 list
• re.sub(p,s,text) : 替换,将 p 匹配到的字符替换为 s.
• pattern = re.compile(p) 先编译 p 模式,当正则表达式模式比较复杂的时候,会先编译,然后再使用
#########获取网页上的图片
#!/usr/bin/env python#coding:utf-8
_author_ = 'hxr'
import re
import urllib,urllib2
def GetHtml(url): ##下载获得网页
try: ##检测异常
page=urllib.urlopen(url)
html=page.read()
except urllib2.URLError,e:
print 'Downloaad error ... %s' %e
return html
def GetImg(html): ##根据网页获得图片地址,并下载
img_re=r'src="(.+\.jpg)"'
img_recom=re.compile(img_re)
imglist=re.findall(img_recom,html)
x=1
for imgurl in imglist:
urllib.urlretrieve(imgurl,"%s.png" %x)
x+=1
html=GetHtml('http://172.25.254.252/')
GetImg(html)