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

详解 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" 写入回车符。因为你没做这项工作,所以你写到文件的所有内容都将显示在同一行上。

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

(0)

相关推荐

  • python实现批量修改文件名代码

    我曾以为,写脚本是很难的,直到我遇到了Python 前言随着国内版权意识的跟进,很多影视音乐资源开始收费,而且度盘又经常随意封杀各种资源,所以,为了保护资源,老司机们越来越倾向于把资源下载到本地,但随着本地资源量的增多,资源管理就成了一件比较头疼的事情;对于资源的管理,方法有很多,我比较喜欢为资源起一个好记的名字,但改文件名是一件无聊又耗时的事情,所以,一个批量重命名的脚本就变得非常重要. 1.批量添加前缀功能 批量重命名 批量重命名逻辑,分三步: (1)确定需要命名的文件们 (2)确定新的文件

  • Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法

    本文实例讲述了Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法.分享给大家供大家参考,具体如下: 问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 belong cnblogs 输出示例 blog 分析 既然打算套用回溯法子集树模板,那就要祭出元素-状态空间分析大法. 以长度较小的字符串中的字符作为元素,以长度较大的字符串中的字符作为状态空间,对每一个元素,遍历它的状态空间,其它的事情

  • Python 异常处理的实例详解

    Python 异常处理的实例详解 与许多面向对象语言一样,Python 具有异常处理,通过使用 try...except 块来实现. Note: Python v s. Java 的异常处理 Python 使用 try...except 来处理异常,使用 raise 来引发异常.Java 和 C++ 使用 try...catch 来处理异常,使用 throw 来引发异常. 异常在 Python 中无处不在:实际上在标准 Python 库中的每个模块都使用了它们,并且 Python 自已会在许多不

  • Python 高级专用类方法的实例详解

    Python 高级专用类方法的实例详解 除了 __getitem__ 和 __setitem__ 之外 Python 还有更多的专用函数.某些可以让你模拟出你甚至可能不知道的功能.下面的例子将展示 UserDict 一些其他专用方法. def __repr__(self): return repr(self.data) (1) def __cmp__(self, dict): (2) if isinstance(dict, UserDict): return cmp(self.data, dic

  • python利用dir函数查看类中所有成员函数示例代码

    前言 如果一个类是别人编写的,又没有帮助文档,怎么样来查看所有成员函数呢?本文详细给大家介绍了关于python用dir函数查看类中所有成员函数的相关内容,下面话不多说了,来一起看看详细的介绍吧. 可以使用下面的代码: # File: builtin-dir-example-2.py class A: def a(self): pass def b(self): pass class B(A): def c(self): pass def d(self): pass def getmembers(

  • Python模拟用户登录验证

    本文实例为大家分享了Python模拟用户登录验证的具体代码,供大家参考,具体内容如下 1.功能简介 此程序模拟用户登录验证的过程,实现用户名输入.黑名单检测.用户有效性判别.密码输入及验证等.用户在3次以内输入正确密码登陆成功,连续输错3次密码登陆失败,且该用户名被记录在黑名单,黑名单中的用户被锁定不能再登陆. 2.实现方法 本程序采用python语言编写,将各项任务进行分解并用定义对应的函数来处理,从而使程序结构清晰,易于维护.主要编写了四个函数: login() #登陆函数,为主函数,完成用

  • Python使用回溯法子集树模板解决爬楼梯问题示例

    本文实例讲述了Python使用回溯法子集树模板解决爬楼梯问题.分享给大家供大家参考,具体如下: 问题 某楼梯有n层台阶,每步只能走1级台阶,或2级台阶.从下向上爬楼梯,有多少种爬法? 分析 这个问题之前用分治法解决过.但是,这里我要用回溯法子集树模板解决它. 祭出元素-状态空间分析大法:每一步是一个元素,可走的步数[1,2]就是其状态空间.不难看出,元素不固定,状态空间固定. 直接上代码. 代码 '''爬楼梯''' n = 7 # 楼梯阶数 x = [] # 一个解(长度不固定,1-2数组,表示

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

    详解 Python 与文件对象共事的实例 Python 有一个内置函数,open,用来打开在磁盘上的文件.open 返回一个文件对象,它拥有一些方法和属性,可以得到被打开文件的信息,以及对被打开文件进行操作. >>> f = open("/music/_singles/kairo.mp3", "rb") (1) >>> f (2) <open file '/music/_singles/kairo.mp3', mode 'r

  • 详解Python类和对象内容

    目录 一.什么是Python类? 二.Python类中的方法和属性 2.1.Python类中的方法 2.2.Python类中的属性 三.面向对象的概念 3.1.Python类:继承 3.2.Python类:多态性 3.3.Python类:抽象 一.什么是Python类? python中的类是创建特定对象的蓝图.它使您可以以特定方式构建软件.问题来了,怎么办?类允许我们以一种易于重用的方式对我们的数据和函数进行逻辑分组,并在需要时进行构建.考虑下图. 在第一张图片(A)中,它代表了一个可以被视为C

  • 以SortedList为例详解Python的defaultdict对象使用自定义类型的方法

    目录 写在前面 第一种方法: 封装成函数 第二种方法: 类封装 写在前面 最近写周赛题, 逃不开的一种题型是设计数据结构, 也就是第三题, 做这种题需要的就是对语言中的容器以及常用排序查找算法的掌握, 而我只熟悉了最基本的一些方法, 做起这些题来总是超时… 为了搞定这些题, 我决定学习一下大佬们的做法, 特别是优先队列的方法维护有序容器以及有序列表等容器, 这些都在Python中封装好了, 用起来很是方便, 但是采用defaultdict的时候, 其缺省数据类型常常需要与题目给出的特定结构匹配,

  • 详解Python import方法引入模块的实例

    详解Python import方法引入模块的实例 在Python用import或者from-import或者from-import-as-来导入相应的模块,作用和使用方法与C语言的include头文件类似.其实就是引入某些成熟的函数库和成熟的方法,避免重复造轮子,提高开发速度. python的import方法可以引入系统的模块,也可以引入我们自己写好的共用模块,这点和PHP非常相似,但是它们的具体细节还不是很一样.因为php是在引入的时候指明引入文件的具体路径,而python中不能够写文件路径进

  • 详解HDFS多文件Join操作的实例

    详解HDFS多文件Join操作的实例 最近在做HDFS文件处理之时,遇到了多文件Join操作,其中包括:All Join以及常用的Left Join操作, 下面是个简单的例子:采用两个表来做left join其中数据结构如下: A 文件: a|1b|2|c B文件: a|b|1|2|c 即:A文件中的第一.二列与B文件中的第一.三列对应:类似数据库中Table的主键/外键 代码如下: import java.io.DataInput; import java.io.DataOutput; imp

  • 详解Python 解压缩文件

    zipfile模块及相关方法介绍: 1 压缩 1.1 创建zipfile对象 zipfile.ZipFile(file, mode='r', compression=0, allowZip64=True, compresslevel=None) 创建Zipfile对象,主要参数: 1>file压缩包名称: 2>mode:读'r'或者写'w'模式: 3>compression:设置压缩格式: 4>compresslevel:压缩等级: 压缩格式分类: 1.2 添加压缩文件 zipob

  • 详解Python相关文件常见的后缀名

    常见的 Python 文件后缀有:py.pyc .pyo. pyi.pyw. pyd. pyx 等. 本文只介绍相对常见的一些后缀名,至于一些特别冷门的文件格式,例如一些文章提到的pyz.pywz.rpy.pyde.pyp. pyt等,并没有进行研究.因为这些扩展名资料很少,网上搜到的文章似乎都是同一个出处,只是简单提了一句,说了等于没说. py 最常见的 Python 源代码文件. 实际上如果用 python + 文件 的方式运行代码,只要文件内容相同,后缀名是不重要的,也就是说下面的运行结果

  • 详解python持久化文件读写

    持久化文件读写: f=open('info.txt','a+') f.seek(0) str1=f.read() if len(str1)==0: f1 = open('info.txt', 'w+') str1 = f.read() # 如果数据没有就写入数据到文件 time_list = ["早上", "中午", "晚上"] character_list = ["小赵","小钱", "小孙&q

  • 实例详解python函数的对象、函数嵌套、名称空间和作用域

    函数的对象 python中一切皆对象 函数对象的四大功能 引用 def f1(): print('from f1') f1() #调用函数 print(f1) print('*'*50) f = f1 # 将函数名f1赋值给f f() # f也可以调用函数 print(f) from f1 <function f1 at 0x000001FB05534620> ************************************************** from f1 <func

  • 详解Python的文件处理

    目录 先学会文件的读写! 我们看看一些文件操作示例吧 读取文件数据 写数据简单展示 按行读取 总结 先学会文件的读写! 比如像以前在学校读书的时候,第一门编程课设计要求是制作学生管理系统. 这就需要使用文件来处理(也可以用数据库,但是一般C语言都是很多计算机系新生的首选语言,这时候大概率也不知道数据库). python 最常用的是open和write函数,如下: #open函数:接收一个文件名,还有其他参数可省略不写. one_file = open('myfile.txt') #读取数据赋值给

随机推荐