python中的一点小知识与库(2)

来源:互联网 发布:443端口号 编辑:程序博客网 时间:2024/06/05 00:18

目录:
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:   blockexcept [exception,[data…]]:   block
#!/usr/bin/pythonimport tracebacktry:    1/0 except Exception as e:    print(e)

结果:

division by zero

(2) try -except-else
语法形如:

try:    blockexcept [exception,[data...]]:   blockelse:   block

该种异常处理语法的规则是:

· 执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。

· 如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。

· 如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。

· 如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

· 如果没有发生异常,则执行else块代码。

(3)try -finally形式
语法如下:

try:   blockfinally:   block

该语句的执行规则是:

· 执行try下的代码。

· 如果发生异常,在该异常传递到下一级try时,执行finally中的代码。

· 如果没有发生异常,则执行finally中的代码。

第二种try语法在无论有没有发生异常都要执行代码的情况下是很有用的。例如我们在python中打开一个文件进行读写操作,我在操作过程中不管是否出现异常,最终都是要把该文件关闭的。

一个例子:

#!/usr/bin/pythonimport tracebacktry:    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/0ZeroDivisionError: division by zerofinally handle

用raise语句手工引发一个异常

语法,和java的throw类似。

raise [exception[,data]]

其他
(1)采用traceback(跟踪)模块查看异常
发生异常时,Python能“记住”引发的异常以及程序的当前状态。Python还维护着traceback(跟踪)对象,其中含有异常发生时与函数调用堆栈有关的信息。记住,异常可能在一系列嵌套较深的函数调用中引发。程序调用每个函数时,Python会在“函数调用堆栈”的起始处插入函数名。一旦异常被引发,Python会搜索一个相应的异常处理程序。如果当前函数中没有异常处理程序,当前函数会终止执行,Python会搜索当前函数的调用函数,并以此类推,直到发现匹配的异常处理程序,或者Python抵达主程序为止。这一查找合适的异常处理程序的过程就称为“堆栈辗转开解”(Stack Unwinding)。解释器一方面维护着与放置堆栈中的函数有关的信息,另一方面也维护着与已从堆栈中“辗转开解”的函数有关的信息。

#!/usr/bin/pythonimport tracebacktry:    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/0ZeroDivisionError: 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.ini2017/05/15  11:08                65 Sample.py2017/05/15  11:03    <DIR>          test2017/05/12  16:20             1,369 test.py2017/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\abcD:\python project-neonpythonTest('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 digitsm = 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 mathprint("e=",math.e,"\npi=",math.pi)print(math.floor(3.4))
e= 2.718281828459045 pi= 3.1415926535897933

常见函数:http://blog.csdn.net/iamaiearner/article/details/9381347
这里写图片描述
这里写图片描述

七、cmath 模块

cmath模块包含了一些用于复数运算的函数. cmath模块的函数跟math模块函数基本一致,区别是cmath模块运算的是复数,math模块运算的是数学运算.

0 0
原创粉丝点击