python异常和文件处理机制详解
本文实例讲述了python异常和文件处理机制。分享给大家供大家参考,具体如下:
1异常处理
Python的异常用
try
except
finally
来处理.并且except后还可以跟else.
引发异常用raise
如果抛出的异常没有被处理.在PythonIDE中是显示一些红色的信息.在真正的Python程序运行时.会导致程序终止.
在以前我们已经见到过一下几种异常:
在Dictionary中如果使用的key不存在.会引发KeyError异常.如:
>>>d={"a":1,"b":"abc"} >>>d["c"] Traceback(mostrecentcalllast):File"<interactiveinput>",line1,in<module> KeyError:'c'
搜索列表中不存在的值.将引发ValueError异常.如:
>>>li=[1,2] >>>li.index(3) Traceback(mostrecentcalllast):File"<interactiveinput>",line1,in<module> ValueError:list.index(x):xnotinlist
对应的.若用下标来引用列表中的元素.若下标出界.会产生IndexError异常.如:
>>>li[2] Traceback(mostrecentcalllast): File"<interactiveinput>",line1,in<module> IndexError:listindexoutofrange
调用不存在的方法.会引发AttributeError异常.
引用不存在的变量.引发NameError异常.
未强制转化就混用数据类型.引发TypeError异常.
文件操作错误引发的IOError.如:
try: fsock=open("/notthere") exceptIOError: print"Thefiledosenotexits..." else: print"openthefile." print"thislinewillalwaysprint"
注意上边的代码中:
open是一个内置函数.用来打开文件.并返回一个文件对象.
tryexcept后边可以跟else语句.当没有捕捉到指定的异常时.执行else语句.
导入一个模块时.若模块不存在.会引发ImportError异常.
还可以定义自己的异常类.定义时让它继承内置的Exception类.然后在需要抛出异常时用raise抛出.
2与文件对象共事
前面说过用open可以打开文件并返回文件对象.它的函数声明如下:
open(name[,mode[,buffering]])
有3个参数(其中后两个是可选的).分别表示文件名.打开方式.缓冲区参数.例如:
>>>f=open("/music/_singles/kairo.mp3","rb")
第2个参数指定为"rb".表示以2进制读打开文件. 如果这个参数缺省.则表示以文本方式打开.
如果不能打开.则open引发IOError异常.
现在可以用文件对象的name属性和mode属性来查询它们.如:
>>>f.name '/music/_singles/kairo.mp3' >>>f.mode 'rb'
打开文件后.就可以进行读写了.如:
>>>f.tell()
查询当前位置.
0 >>>f.seek(0,2)
定位文件指针.第一个参数是偏移值.第二个可以取0.1.2三个值.分别表示开头.当前位置.末尾.
若定位的地址不正确(例如超过范围)则引发IOError异常.
所以这个语句就把文件指针定位到了文件尾.
>>>f.tell()
这将打印文件的长度.
>>>f.seek(-128,2) >>>data=f.read(128)
读取文件的最后128字节.并将读入的的数据作为字符串返回.读取数据时也同时后移文件指针.
其中read的参数表示最大读取字节数.也可以省略这个参数.则表示一直读到文件末尾.
若读取时出现错误(如磁盘上有坏扇区或网络已断开).引发IOError异常.
>>>f.closed
查看文件是否关闭.
False >>>f.close()
不再使用时应该关闭文件.可以对一个已经关闭的文件再次关闭(不会发生异常).
>>>f.closed True
关闭之后如果再对f进行seek()等操作.会引发ValueError异常.
写入文件的办法和读取类似.不过它要求文件是"写"打开的.如:
>>>f1=open('test.log','w')
其中'w'表示写打开.这样即使文件不存在.也会创建.如果存在.则覆盖现有的文件.
>>>f1.write('abc') >>>f1.close() >>>file('test.log').read()
用file()打开文件和用open()打开是一样的.所以打印:
'abc'
3for循环
在Python中.for用来在一个List上遍历.如:
>>>li=[1,2,3] >>>foriinli:
这会在循环中让i依次接收li中的元素的值.
... printi
...
1
2
3
这个输出和print"\n".joni(li)一样.
如果要象其它语言中一样.让for做计数使用.可以用如下的办法:
>>>foriinrange(len(li)):printli[i] ... 1 2 3
要用for来遍历Dictionary.如下:
>>>d={1:"abc",2:"def"} >>>fork,vind.items():print"%d=%s"%(k,v) ... 1=abc 2=def
上边的打印结果和print"\n".join(["%d=%s"%(k,v)fork,vind.items()])一样.
4使用sys.modules
在Python中.modules是定义在sys模块中的一个全局的字典对象.
一旦我们import一个模块.就可以在sys.modules中找到它.
每个类都拥有一个内置的"类属性":__module__.其值为定义该类的模块的名字.
5与Directory共事
在os.path所引用的模块中有几个操作文件和目录的函数.如:
>>>importos >>>os.path.join("c:\music","mahadeva.mp3")
这个join函数用来将一个或多个字符串构造成一个路径名.
'c:\music\mahadeva.mp3' >>>os.path.expanduser("~")
expanduser函数用'~'作参数时.返回当前用户根目录.
'c:\DocumentsandSettings\mpilgrim\MyDocuments'
>>>(filepath,filename)=os.path.split("c:\music\a.mp3")
split函数用来将一个路径名分成目录名和文件名.它返回的是一个tuple.用返回的tuple对(filepath,filename)赋值.
>>>filepath 'c:\music' >>>filename 'a.mp3' >>>(a,b)=os.path.splitext("a.mp3")
类似的.这个splitext用来将一个全文件名分成文件名和扩展名两部分.
>>>a 'a' >>>b '.mp3'
列出目录用:
>>>os.listdir("c:\")
这个函数将返回一个字符串list.包括所有的文件和文件夹的名字.
['boot.ini','CONFIG.SYS','AUTOEXEC.BAT','java',等]
要判断一个字符串路径到底是一个文件还是一个文件夹.用os.path模块中的isfile()或isdir().如:
>>>[fforfinos.listdir("c:")ifos.path.isdir(os.path.join("c:",f))]
这样就打印出c中所有文件夹名构成的list.
如果要在目录操作中使用通配符.可以如下:
>>>importglob
要先导入glob模块
>>>glob.glob('c:\music\*.mp3')
则返回的list中包含了该目录下所有的.mp3后缀的文件名.
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python文件与目录操作技巧汇总》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《PythonSocket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。