详解 Python 与文件对象共事的实例


Posted in Python onSeptember 11, 2017

详解 Python 与文件对象共事的实例

Python 有一个内置函数,open,用来打开在磁盘上的文件。open 返回一个文件对象,它拥有一些方法和属性,可以得到被打开文件的信息,以及对被打开文件进行操作。

>>> f = open("/music/_singles/kairo.mp3", "rb") (1) 
>>> f                      (2) 
<open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> 
>>> f.mode                   (3) 
'rb' 
>>> f.name                   (4) 
'/music/_singles/kairo.mp3'

(1)  open 方法可以接收三个参数:文件名、模式和缓冲区参数。只有第一个参数 (文件名) 是必须的;其它两个是可选的。如果没有指定,文件以文本方式打开。这里我们以二进制方式打开文件进行读取。(print open.__doc__ 会给出所有可能模式的很好的解释。)
(2)  open 函数返回一个对象 (到现在为止,这一点应该不会使你感到吃惊)。一个文件对象有几个有用的属性。
(3)  文件对象的 mode 属性告诉你文件以何种模式被打开。
(4)  文件对象的 name 属性告诉你文件对象所打开的文件名。

1. 读取文件

你打开文件之后,你要做的第一件事是从中读取,正如下一个例子所展示的。

>>> f 
<open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> 
>>> f.tell()       (1) 
0 
>>> f.seek(-128, 2)    (2) 
>>> f.tell()       (3) 
7542909 
>>> tagData = f.read(128) (4) 
- 99 -Dive Into Python http://diveintopython.org/ 
>>> tagData 
'TAGKAIRO****THE BEST GOA     ***DJ MARY-JANE***       
Rave Mix           2000http://mp3.com/DJMARYJANE   \037' 
>>> f.tell()       (5) 
7543037

(1)  一个文件对象维护它所打开文件的状态。文件对象的 tell 方法告诉你在被打开文件中的当前位置。因为我们还没有对这个文件做任何事,当前位置为 0,它是文件的起始处。
(2)  文件对象的 seek 方法在被打开文件中移动到另一个位置。第二个参数指出第一个参数是什么意思:0 表示移动到一个绝对位置 (从文件起始处算起),1 表示移到一个相对位置 (从当前位置算起),还有 2 表示相对于文件尾的位置。因为我们搜索的 MP3 标记保存在文件的末尾,我们使用 2 并且告诉文件对象从文件尾移动到 128 字节的位置。
(3)  tell 方法确认了当前位置已经移动了。
(4)  read 方法从被打开文件中读取指定个数的字节,并且返回含有读取数据的字符串。可选参数指定了读取的最大字节数。如果没有指定参数,read 将读到文件末尾。(我们本可以在这里简单地说 read() ,因为我们确切地知道在文件的何处,事实上,我们读的是最后 128 个字节。) 读出的数据赋给变量 tagData,并且当前的位置根据所读的字节数作了修改。
(5)  tell 方法确认了当前位置已经移动了。如果做一下算术,你会看到在读了 128 个字节之后,位置数已经增加了 128。

2. 关闭文件

打开文件消耗系统资源,并且其间其它程序可能无法访问它们 (取决于文件模式)。这就是一旦操作完毕就该关闭文件的重要所在。

>>> f 
<open file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> 
>>> f.closed    (1) 
False 
>>> f.close()   (2) 
>>> f 
<closed file '/music/_singles/kairo.mp3', mode 'rb' at 010E3988> 
>>> f.closed    (3) 
True 
>>> f.seek(0)   (4) 
Traceback (innermost last): 
- 100 -Dive Into Python http://diveintopython.org/ 
 File "<interactive input>", line 1, in ? 
ValueError: I/O operation on closed file 
>>> f.tell() 
Traceback (innermost last): 
 File "<interactive input>", line 1, in ? 
ValueError: I/O operation on closed file 
>>> f.read() 
Traceback (innermost last): 
 File "<interactive input>", line 1, in ? 
ValueError: I/O operation on closed file 
>>> f.close()   (5)

(1)  文件对象的 closed 属性表示对象是打开还是关闭了文件。在本例中,文件仍然打开着 (closed 是 False)。

(2)  为了关闭文件,调用文件对象的 close 方法。这样就释放掉你加在文件上的锁 (如果有的话),刷新被缓冲的系统还未写入的输出 (如果有的话),并且释放系统资源。

(3)  closed 属性证实了文件被关闭了。

(4)  文件被关闭了,但这并不意味着文件对象不再存在。变量 f 将继续存在,直到它超出作用域或被手工删除。然而,一旦文件被关闭,操作它的方法就没有一个能使用;它们都会引发异常。

(5)  对一个文件已经关闭的文件对象调用 close 不会 引发异常,它静静地失败。

3. 处理  I/O 错误

现在你已经足能理解前一章的例子程序 fileinfo.py 的文件处理代码了。下面这个例子展示了如何安全地打开文件和读取文件,以及优美地处理错误。

try:                (1) 
      fsock = open(filename, "rb", 0) (2) 
      try:               
        fsock.seek(-128, 2)     (3) 
        tagdata = fsock.read(128)  (4) 
      finally:            (5) 
        fsock.close()        
      . 
      . 
      . 
    except IOError:           (6) 
      pass

(1)  因为打开和读取文件有风险,并且可能引发异常,所有这些代码都用一个 try...except 块封装。(嘿,标准化的缩近不好吗?这就是你开始欣赏它的地方。)
(2)  open 函数可能引发 IOError 异常。(可能是文件不存在。)
(3)  seek 方法可能引发 IOError 异常。(可能是文件长度小于 128 字节。)
(4)  read 方法可能引发 IOError 异常。(可能磁盘有坏扇区,或它在一个网络驱动器上,而网络刚好断了。)
(5)  这是新的:一个 try...finally 块。一旦文件通过 open 函数被成功地打开,我们应该绝对保证把它关闭,即使是在 seek 或 read 方法引发了一个异常时。try...finally 块可以用来:在 finally 块中的代码将
总是 被执行,甚至某些东西在 try 块中引发一个异常也会执行。可以这样考虑,不管在路上发生什么,代码都会被 “即将灭亡” 地执行。
(6)  最后,处理我们的 IOError 异常。它可能是由调用 open、seek 或 read 引发的 IOError 异常。这里,我们其实不用关心,因为将要做的事就是静静地忽略它然后继续。(记住,pass 是一条不做任何事的 Python 语句。) 这样完全合法,“处理” 一个异常可以明确表示不做任何事。它仍然被认为处理过了,并且处理将正常继续,从 try...except 块的下一行代码开始。

4. 写入文件

正如你所期待的,你也能用与读取文件同样的方式写入文件。有两种基本的文件模式:

• 追加 (Append) 模式将数据追加到文件尾。
• 写入 (write) 模式将覆盖文件的原有内容。

如果文件还不存在,任意一种模式都将自动创建文件,因此从来不需要任何复杂的逻辑:“如果 log 文件还不存在,将创建一个新的空文件,正因为如此,你可以第一次就打开它”。打开文件并开始写就可以了。

>>> logfile = open('test.log', 'w') (1) 
>>> logfile.write('test succeeded') (2) 
>>> logfile.close() 
>>> print file('test.log').read()  (3) 
test succeeded 
>>> logfile = open('test.log', 'a') (4) 
- 102 -Dive Into Python http://diveintopython.org/ 
>>> logfile.write('line 2') 
>>> logfile.close() 
>>> print file('test.log').read()  (5) 
test succeededline 2

(1)  你可以大胆地开始创建新文件 test.log 或覆盖现有文件,并为写入目的而打开它。(第二个参数 "w" 的意思是为文件写入而打开。) 是的,它和想象中的一样危险。我希望你不要关心文件以前的内容,因为它现在已经不存在了。

(2)  你可以使用 open 返回的文件对象的 write 方法向一个新打开的文件添加数据。

(3)  file 是 open 的同义语。这一行语句打开文件,读取内容,并打印它们。

(4)  碰巧你知道 test.log 存在 (因为你刚向它写完了数据),所以你可以打开它并向其追加数据。("a" 参数的意思是为追加目的打开文件。) 实际上即使文件不存在你也可以这样做,因为以追加方式打开一文件时,如果需要的话会创建文件。但是追加操作从不 损坏文件的现有内容。

(5)  正如你所看到的,原来的行和你以追加方式写入的第二行现在都在 test.log 中了。同时注意两行之间并没包含回车符。因为两次写入文件时都没有明确地写入回车符,所以文件中没有包含回车符。你可以用 "\n" 写入回车符。因为你没做这项工作,所以你写到文件的所有内容都将显示在同一行上。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Python 相关文章推荐
Python获取任意xml节点值的方法
May 05 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 Python
Python向Excel中插入图片的简单实现方法
Apr 24 Python
pandas 空的dataframe 插入列名的示例
Oct 30 Python
从运行效率与开发效率比较Python和C++
Dec 14 Python
对python 多线程中的守护线程与join的用法详解
Feb 18 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
docker-py 用Python调用Docker接口的方法
Aug 30 Python
python 实现快速生成连续、随机字母列表
Nov 28 Python
pytorch 限制GPU使用效率详解(计算效率)
Jun 27 Python
.img/.hdr格式转.nii格式的操作
Jul 01 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 Python
Python 私有函数的实例详解
Sep 11 #Python
Python模拟用户登录验证
Sep 11 #Python
Python模拟三级菜单效果
Sep 11 #Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 #Python
Python 模拟购物车的实例讲解
Sep 11 #Python
python添加模块搜索路径方法
Sep 11 #Python
解决Django模板无法使用perms变量问题的方法
Sep 10 #Python
You might like
apache配置虚拟主机的方法详解
2013/06/17 PHP
php获取淘宝分类id示例
2014/01/16 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
2016/07/25 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
详解Python中用于计算指数的exp()方法
2015/05/14 Python
基于wxpython开发的简单gui计算器实例
2015/05/30 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
python 解压pkl文件的方法
2018/10/25 Python
Python操作json的方法实例分析
2018/12/06 Python
Python I/O与进程的详细讲解
2019/03/08 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?
2015/11/18 面试题
初中优秀教师事迹材料
2014/08/18 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
2014年纪检工作总结
2014/11/12 职场文书
上甘岭观后感
2015/06/10 职场文书
六一亲子活动感想
2015/08/07 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
2019年思想汇报
2019/06/20 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
JavaScript中isPrototypeOf函数
2021/11/07 Javascript