详解 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 Django(图文)
Nov 04 Python
Python日志模块logging简介
Apr 13 Python
为Python程序添加图形化界面的教程
Apr 29 Python
Python自动化运维和部署项目工具Fabric使用实例
Sep 18 Python
Python随机读取文件实现实例
May 25 Python
Python使用sorted排序的方法小结
Jul 28 Python
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
python字符串常用方法
Jun 14 Python
pycharm导入源码的具体步骤
Aug 04 Python
Pycharm制作搞怪弹窗的实现代码
Feb 19 Python
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
Jun 11 Python
在Python 中将类对象序列化为JSON
Apr 06 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
PHP初学者头疼问题总结
2006/07/08 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
PHP5函数小全(分享)
2013/06/06 PHP
控制PHP的输出:缓存并压缩动态页面
2013/06/11 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
为原生js Array增加each方法
2012/04/07 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
jquery基础教程之deferred对象使用方法
2014/01/22 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
JS实现页面打印功能
2017/03/16 Javascript
require.js与bootstrap结合实现简单的页面登录和页面跳转功能
2017/05/12 Javascript
简单谈谈vue的过渡动画(推荐)
2017/10/11 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
浅谈django开发者模式中的autoreload是如何实现的
2017/08/18 Python
Python自定义简单图轴简单实例
2018/01/08 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
Django框架models使用group by详解
2020/03/11 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
SQL Server面试题
2013/04/04 面试题
Oracle性能调优原则
2012/05/03 面试题
EJB面试题
2015/07/28 面试题
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
最新计算机专业自荐信
2013/10/16 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书