目录:
4. exceptions 处理
5. os 模块
6. re模块
7. math 模块
四. exceptions 处理
exceptions 模块提供了标准异常的层次结构. Python 启动的时候会自动导入这个模块, 并且将它加入到 _ builtin _ 模块中. 也就是说, 一般不需要手动导入这个模块.
py3没有这个模块,已经内置了,不需要添加
标准异常:
• Exception 是所有异常的基类. 强烈建议(但不是必须)自定义的异常异常也继承这个类.
• SystemExit(Exception) 由 sys.exit 函数引发. 如果它在最顶层没有被 try-except 语句捕获, 那么解释器将直接关闭而不会显示任何跟踪返回信息.
• StandardError(Exception) 是所有内建异常的基类(除 SystemExit 外).
• KeyboardInterrupt(StandardError) 在用户按下 Control-C(或其他打断按键)后 被引发. 如果它可能会在你使用 “捕获所有” 的 try-except 语句时导致奇怪的问题.
• ImportError(StandardError) 在 Python 导入模块失败时被引发.
• EnvironmentError 作为所有解释器环境引发异常的基类. (也就是说, 这些异常一般不是由于程序 bug 引起).
• IOError(EnvironmentError) 用于标记 I/O 相关错误.
• OSError(EnvironmentError) 用于标记 os 模块引起的错误.
• WindowsError(OSError) 用于标记 os 模块中 Windows 相关错误.
• NameError(StandardError) 在 Python 查找全局或局部名称失败时被引发.
• UnboundLocalError(NameError) , 当一个局部变量还没有赋值就被使用时, 会引发这个异常. 这个异常只有 在 2.0 及之后的版本有; 早期版本只会引发一个普通的 NameError .
• AttributeError(StandardError) , 当 Python 寻找(或赋值)给一个实例属性, 方法, 模块功能或其它有效的命名失败时, 会引发这个异常.
• SyntaxError(StandardError) , 当解释器在编译时遇到语法错误, 这个异常就被引发.
• (2.0 及以后版本) IndentationError(SyntaxError) 在遇到非法的缩进时被引发. 该异常只用于 2.0 及以后版本, 之前版本会引发一个 SyntaxError 异常.
• (2.0 及以后版本) TabError(IndentationError) , 当使用 -tt 选项检查不一致缩进时有可能被引发. 该异常只用于 2.0 及以后版本, 之前版本会引发一个 SyntaxError 异常.
• TypeError(StandardError) , 当给定类型的对象不支持一个操作时被引发.
• AssertionError(StandardError) 在 assert 语句失败时被引发(即表达式为 false 时).
• LookupError(StandardError) 作为序列或字典没有包含给定索引或键时所引发异常的基类.
• IndexError(LookupError) , 当序列对象使用给定索引数索引失败时(不存在索引对应对象)引发该异常.
• KeyError(LookupError) 当字典对象使用给定索引索引失败时(不存在索引对应对象)引发该异常.
• ArithmeticError(StandardError) 作为数学计算相关异常的基类.
• OverflowError(ArithmeticError) 在操作溢出时被引发(例如当一个整数太大, 导致不能符合给定类型).
• ZeroDivisionError(ArithmeticError) , 当你尝试用 0 除某个数时被引发.
• FloatingPointError(ArithmeticError) , 当浮点数操作失败时被引发.
• ValueError(StandardError) , 当一个参数类型正确但值不合法时被引发.
• (2.0 及以后版本) UnicodeError(ValueError) , Unicode 字符串类型相关异常. 只使用在 2.0 及以后版本.
• RuntimeError(StandardError) , 当出现运行时问题时引发, 包括在限制模式下尝试访问外部内容, 未知的硬件问题等等.
• NotImplementedError(RuntimeError) , 用于标记未实现的函数, 或无效的方法.
• SystemError(StandardError) , 解释器内部错误. 该异常值会包含更多的细节 (经常会是一些深层次的东西, 比如 “eval_code2: NULL
globals” ) . 这本书的作者编了 5 年程序都没见过这个错误. (想必是没有用 raise SystemError ).
• MemoryError(StandardError) , 当解释器耗尽内存时会引发该异常. 注意只有在底层内存分配抱怨时这个异常才会发生; 如果是在你的旧机器上, 这个异常发生之前系统会陷入混乱的内存交换中.
下面主要说明exception的处理:
整理:http://www.cnblogs.com/dkblog/archive/2011/06/24/2089026.html
(1)try -exception语法
形如:
try:
block
except [exception,[data…]]:
block
#!/usr/bin/python
import traceback
try:
1/0
except Exception as e:
print(e)
结果:
division by zero
(2) try -except-else
语法形如:
try:
block
except [exception,[data...]]:
block
else:
block
该种异常处理语法的规则是:
· 执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。
· 如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。
· 如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。
· 如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
· 如果没有发生异常,则执行else块代码。
(3)try -finally形式
语法如下:
try:
block
finally:
block
该语句的执行规则是:
· 执行try下的代码。
· 如果发生异常,在该异常传递到下一级try时,执行finally中的代码。
· 如果没有发生异常,则执行finally中的代码。
第二种try语法在无论有没有发生异常都要执行代码的情况下是很有用的。例如我们在python中打开一个文件进行读写操作,我在操作过程中不管是否出现异常,最终都是要把该文件关闭的。
一个例子:
#!/usr/bin/python
import traceback
try:
1/0
except Exception as e:
print(traceback.format_exc())
finally:
print("finally handle")
结果:
Traceback (most recent call last):
File "D:\python project-neon\pythonTest\src\Sample.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
finally handle
用raise语句手工引发一个异常
语法,和java的throw类似。
raise [exception[,data]]
其他
(1)采用traceback(跟踪)模块查看异常
发生异常时,Python能“记住”引发的异常以及程序的当前状态。Python还维护着traceback(跟踪)对象,其中含有异常发生时与函数调用堆栈有关的信息。记住,异常可能在一系列嵌套较深的函数调用中引发。程序调用每个函数时,Python会在“函数调用堆栈”的起始处插入函数名。一旦异常被引发,Python会搜索一个相应的异常处理程序。如果当前函数中没有异常处理程序,当前函数会终止执行,Python会搜索当前函数的调用函数,并以此类推,直到发现匹配的异常处理程序,或者Python抵达主程序为止。这一查找合适的异常处理程序的过程就称为“堆栈辗转开解”(Stack Unwinding)。解释器一方面维护着与放置堆栈中的函数有关的信息,另一方面也维护着与已从堆栈中“辗转开解”的函数有关的信息。
#!/usr/bin/python
import traceback
try:
1/0
except Exception as e:
print(traceback.format_exc())
结果:
Traceback (most recent call last):
File "D:\python project-neon\pythonTest\src\Sample.py", line 4, in <module>
1/0
ZeroDivisionError: division by zero
(2)采用sys模块回溯最后的异常
即调用函数:sys.exc_info(),返回值是一个tuple, (type, value/message, traceback)。这里的type —- 异常的类型,value/message —- 异常的信息或者参数,traceback —- 包含调用栈信息的对象。
从这点上可以看出此方法涵盖了traceback.
(3)异常处理的一些其它用途
除了处理实际的错误条件之外,对于异常还有许多其它的用处。在标准 Python 库中一个普通的用法就是试着导入一个模块,然后检查是否它能使用。导入一个并不存在的模块将引发一个 ImportError 异常。你可以使用这种方法来定义多级别的功能――依靠在运行时哪个模块是有效的,或支持多种平台 (即平台特定代码被分离到不同的模块中)。
你也能通过创建一个从内置的 Exception 类继承的类定义你自己的异常,然后使用 raise 命令引发你的异常。如果你对此感兴趣,请看进一步阅读的部分。
五. os模块
这个模块中的大部分函数通过对应平台相关模块实现, 比如 posix 和 nt. os 模块会在第一次导入的时候自动加载合适的执行模块.
os模块的常用功能:
1 os.name
显示当前使用的平台
import os
print(os.name)
结果:
nt
2 os.getcwd()
显示当前python脚本工作路径
import os
print(os.getcwd())
#输出:D:\python project-neon\pythonTest\src
3. os.listdir(‘dirname’)
返回指定目录下的所有文件和目录名,Linux下不会显示“.”和“..”两个目录
import os
print(os.listdir())
#['python_paste.ini', 'Sample.py', 'Sample2.py', 'test.py', 'v1']
* 4. os.remove(‘filename’) *
删除一个文件
import os
print(os.listdir())
os.remove("Sample2.py")
print(os.listdir())
'''
['python_paste.ini', 'Sample.py', 'Sample2.py', 'test.py', 'v1']
['python_paste.ini', 'Sample.py', 'test.py', 'v1']
'''
* 5 os.makedirs(‘dirname/dirname’) *
可生成多层递规目录,如下面例子中,会生成test目录,并在test下,包含test1/test2
import os
os.makedirs("test/test1/test2", 666, False)
print(os.listdir())
#['python_paste.ini', 'Sample.py', 'test', 'test.py', 'v1']
* 6 os.rmdir(‘dirname’) *
删除单级目录
import os
os.rmdir("test/test1/test3")
print(os.listdir())
* 7 os.rename(“oldname”,”newname”) *
重命名文件
* 8 os.system() *
在当前进程下执行一个新命令,运行命令。在linux下,是运行shell支持的命令,在windows下,需要cmd的支持。
import os
os.system("pwd")
os.system("dir")
print("finished")
输出:
'pwd' 不是内部或外部命令,也不是可运行的程序或批处理文件。
驱动器 D 中的卷是 软件_多媒体
卷的序列号是 269B-EC84
D:\python project-neon\pythonTest\src 的目录
2017/05/15 11:03 <DIR> .
2017/05/15 11:03 <DIR> ..
2017/05/12 16:10 433 python_paste.ini
2017/05/15 11:08 65 Sample.py
2017/05/15 11:03 <DIR> test
2017/05/12 16:20 1,369 test.py
2017/05/12 16:22 <DIR> v1
3 个文件 1,867 字节
4 个目录 16,439,742,464 可用字节
finished
命令通过操作系统的标准 shell 执行, 并返回 shell 的退出状态。由于 os.system 直接将命令传递给 shell , 所以如果你不检查传入参数的时候会很危险 (比如命令 os.system(“viewer %s” % file) , 将 file 变量设置为 “sample.jpg; rm -rf $HOME” …. ). 如果不确定参数的安全性, 那么最好使用 exec 或 spawn 代替.
exec 函数会使用新进程替换当前进程(或者说是”转到进程”),在 下面例子中, 字符串 “goodbye” 永远不会被打印.
import os
import sys
program = "python"
arguments = ["Sample2.py"]
print(os.execvp(program, (program,) + tuple(arguments)))
print("goodbye")
Sample2.py
print("hello world")
输出:
hello world
Python 提供了很多表现不同的 exec 函数. Example 1-35 使用的是 execvp 函数, 它会从标准路径搜索执行程序, 把第二个参数(元组)作为单独的参数传递给程序, 并使用当前的环境变量来运行程序.
在 Unix 环境下, 你可以通过组合使用 exec , fork 以及 wait 函数来从当前程序调用另一个程序. fork 函数复制当前进程, wait 函数会等待一个子进程执行结束.
fork 和 wait 函数在 Windows 上是不可用的, 但是你可以使用 spawn 函数. 不过, spawn 不会沿着路径搜索可执行文件, 你必须自己处理好这些.
* os._exit *
_exit 函数会终止当前进程. 注意和sys模块中的函数 sys.exit的 不同:sys.exit是抛出一个异常,如果调用者(caller) 捕获了 SystemExit 异常, 程序仍然会继续执行,但是os._exit则会强制退出程序
import os
import sys
try:
sys.exit(1)
except SystemExit as value:
print("caught exit(%s)" % value)
print("block 1" )
try:
os._exit(2)
except SystemExit as value:
print("caught exit(%s)" % value )
print("block 2" )
print("bye!" )
输出:
caught exit(1)
block 1
* 9 os.sep *
显示当前平台下路径分隔符
import os
print(os.sep)
# \
* 10. os.linesep *
给出当前平台使用的行终止符
11 os.environ
获取系统环境变量
import os
print(os.linesep)
print(os.environ)
os.path 子模块
os.path.abspath(path) :显示path的绝对路径,path可以不存在,如下面例子中,当前目录下不存在abc文件或目录,返回的结果为“当前绝对目录+path”
os.path.dirname(path) :返回该路径的父目录
os.path.basename(path)
os.path.isfile(path) : 如果path是一个文件,则返回True
os.path.isdir(path) : 如果path是一个目录,则返回True
os.path.split(path) : 将path分割成路径名和文件名。(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
os.path.join(path,name) : 连接目录与文件名或目录 结果为path/name
import os
print(os.path.abspath("abc"))
print(os.path.dirname("D:\python project-neon\pythonTest"))
print(os.path.basename("D:\python project-neon\pythonTest"))
print(os.path.split("D:\python project-neon\pythonTest" ))
print(os.path.join("D:\python project-neon\pythonTest","abc"))
D:\python project-neon\pythonTest\src\abc
D:\python project-neon
pythonTest
('D:\\python project-neon', 'pythonTest')
D:\python project-neon\pythonTest\abc
其他函数:
os.path.walk :
os.path.expanduser :
os.path.expandvars :
* *
本节原文连接:http://www.cnblogs.com/MnCu8261/p/5483657.html
六、re模块
re 模块提供了一系列功能强大的正则表达式 (regular expression) 工具, 它们允许你快速检查给定字符串是否与给定的模式匹配 (使用 match 函数), 或者包含这个模式 (使用 search 函数). 正则表达式是以紧凑(也很神秘)的语法
写出的字符串模式.
一个简单的例子:
import re
text = "The Attila the Hun Show"
m = re.match(".", text)
if m: print(repr("."), "=>", repr(m.group(0)) )
#output:'.' => 'T'
m = re.match(".*", text)
if m: print(repr(".*"), "=>", repr(m.group(0)) )
#output:'.*' => 'The Attila the Hun Show'
# a string of letters (at least one)
m = re.match("\w+", text)
if m: print(repr("\w+"), "=>", repr(m.group(0)) )
#output:'\\w+' => 'The'
# a string of digits
m = re.match("\d+", text)
if m: print(repr("\d+"), "=>", repr(m.group(0)))
#output:null
1. match 函数
search 函数会在字符串内查找模式匹配, 如 Example 1-56 所示. 它在所有可能的字符位置尝试匹配模式, 从最左边开始, 一旦找到匹配就返回一个匹配对象. 如果没有找到相应的匹配, 就返回 None .
2. search函数
re.match与re.search的区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
3 .re.findall
re.findall可以获取字符串中所有匹配的字符串
import re
text = "Date :2017 year 6month 1day"
m = re.search("\d+", text)
if m: print(repr("\d+"), "=>", m)
#output:'\\d+' => <_sre.SRE_Match object; span=(6, 10), match='2017'>
text = "Date :2017 year 6month 1day"
m = re.findall("\d+", text)
if m: print(repr("\d+"), "=>", m)
#output:'\\d+' => ['2017', '6', '1']
4.sub 函数
re.sub用于替换字符串中的匹配项。下面一个例子将字符串中的空格 ’ ’ 替换成 ‘-’ :
import re
text = "Date :2017 year 6month 1day"
m = re.sub("\d+", "new-Number",text)
if m: print(repr("\d+"), "=>", m)
#output:'\\d+' => Date :new-Number year new-Numbermonth new-Numberday
5.re.split
使用re.split来分割字符串
6 .re.compile
可以把正则表达式编译成一个正则表达式对象。可以把那些经常使用的正则表达式编译成正则表达式对象,这样可以提高一定的效率。
七、math 模块
math 模块实现了许多对浮点数的数学运算函数. 这些函数一般是对平台 C 库中同名函数的简单封装, 所以一般情况下, 不同平台下计算的结果可能稍微地有所不同, 有时候甚至有很大出入
import math
print("e=",math.e,"\npi=",math.pi)
print(math.floor(3.4))
e= 2.718281828459045
pi= 3.141592653589793
3
常见函数:http://blog.csdn.net/iamaiearner/article/details/9381347
七、cmath 模块
cmath模块包含了一些用于复数运算的函数. cmath模块的函数跟math模块函数基本一致,区别是cmath模块运算的是复数,math模块运算的是数学运算.