python异常和文件处理机制详解


Posted in Python onJuly 19, 2016

本文实例讲述了python异常和文件处理机制。分享给大家供大家参考,具体如下:

1 异常处理

Python的异常用
try
except
finally
来处理. 并且except后还可以跟 else .

引发异常用 raise

如果抛出的异常没有被处理. 在Python IDE中是显示一些红色的信息. 在真正的Python程序运行时. 会导致程序终止.

在以前我们已经见到过一下几种异常:

在 Dictionary 中如果使用的 key 不存在. 会引发 KeyError 异常. 如:

>>> d = {"a":1, "b":"abc"}
>>> d["c"]
Traceback (most recent call last): File "<interactive input>", line 1, in <module>
KeyError: 'c'

搜索列表中不存在的值. 将引发 ValueError 异常. 如:

>>> li = [1,2]
>>> li.index(3)
Traceback (most recent call last): File "<interactive input>", line 1, in <module>
ValueError: list.index(x): x not in list

对应的. 若用下标来引用列表中的元素. 若下标出界. 会产生 IndexError 异常. 如:

>>> li[2]
Traceback (most recent call last):
 File "<interactive input>", line 1, in <module>
IndexError: list index out of range

调用不存在的方法. 会引发 AttributeError 异常.

引用不存在的变量. 引发 NameError 异常.

未强制转化就混用数据类型. 引发 TypeError 异常.

文件操作错误引发的 IOError. 如:

try:
  fsock = open("/notthere")
except IOError:
  print "The file dose not exits..."
else:
  print "open the file."
print "this line will always print"

注意上边的代码中:

open 是一个内置函数. 用来打开文件. 并返回一个文件对象.
try except 后边可以跟 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'

3 for循环

在Python中. for用来在一个List上遍历. 如:

>>> li = [1, 2, 3]
>>> for i in li:

这会在循环中让 i 依次接收 li 中的元素的值.

...  print i
...
1
2
3

这个输出和 print "\n".joni(li) 一样.
如果要象其它语言中一样. 让for做计数使用. 可以用如下的办法:

>>> for i in range(len(li)) : print li[i]
...
1
2
3

要用 for 来遍历 Dictionary . 如下:

>>> d = {1:"abc", 2:"def"}
>>> for k, v in d.items() : print "%d = %s" % (k, v)
...
1 = abc
2 = def

上边的打印结果和 print "\n".join(["%d = %s" % (k, v) for k, v in d.items()]) 一样.

4 使用 sys.modules

在Python中. modules 是定义在sys模块中的一个全局的字典对象.

一旦我们import一个模块. 就可以在 sys.modules 中找到它.

每个类都拥有一个内置的"类属性" : __module__ . 其值为定义该类的模块的名字.

5 与Directory共事

在os.path 所引用的模块中有几个操作文件和目录的函数.如:

>>> import os
>>> os.path.join("c:\music", "mahadeva.mp3")

这个join函数用来将一个或多个字符串构造成一个路径名.

'c:\music\mahadeva.mp3'
>>> os.path.expanduser("~")

expanduser函数用'~'作参数时. 返回当前用户根目录.
'c:\Documents and Settings\mpilgrim\My Documents'

>>> (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(). 如:

>>> [f for f in os.listdir("c:") if os.path.isdir(os.path.join("c:", f))]

这样就打印出c中所有文件夹名构成的list.

如果要在目录操作中使用通配符. 可以如下:

>>> import glob

要先导入 glob 模块

>>> glob.glob('c:\music\*.mp3')

则返回的list中包含了该目录下所有的 .mp3 后缀的文件名.

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python django 访问静态文件出现404或500错误
Jan 20 Python
利用Python实现网络测试的脚本分享
May 26 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
基于python实现简单日历
Jul 28 Python
对Python中list的倒序索引和切片实例讲解
Nov 15 Python
python安装requests库的实例代码
Jun 25 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 Python
Win10环境python3.7安装dlib模块趟过的坑
Aug 01 Python
python垃圾回收机制(GC)原理解析
Dec 30 Python
Django CBV模型源码运行流程详解
Aug 17 Python
python实现画图工具
Aug 27 Python
Python中的xlrd模块使用整理
Jun 15 Python
python线程、进程和协程详解
Jul 19 #Python
浅谈python字符串方法的简单使用
Jul 18 #Python
python读取oracle函数返回值
Jul 18 #Python
Python读取一个目录下所有目录和文件的方法
Jul 15 #Python
Python在线运行代码助手
Jul 15 #Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 #Python
python 性能提升的几种方法
Jul 15 #Python
You might like
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
世界第一个无线广播电台 KDKA
2021/03/01 无线电
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
JS原型链怎么理解
2016/06/27 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
微信小程序实现带参数的分享功能(两种方法)
2019/05/17 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
JavaScript实现多球运动效果
2020/09/07 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
一行Python代码制作动态二维码的实现
2019/09/09 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
python为什么会环境变量设置不成功
2020/06/23 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
举例说明类变量和实例变量的区别
2016/06/30 面试题
公司车队管理制度
2015/08/04 职场文书
nginx安装以及配置的详细过程记录
2021/09/15 Servers
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers