详解 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__ 会给出所有可能模式的很好的解释。) 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 37' >>> f.tell() (5) 7543037 (1) 一个文件对象维护它所打开文件的状态。文件对象的 tell 方法告诉你在被打开文件中的当前位置。因为我们还没有对这个文件做任何事,当前位置为 0,它是文件的起始处。 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>",in ? ValueError: I/O operation on closed file >>> f.read() Traceback (innermost last): File "<interactive input>",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 块封装。(嘿,标准化的缩近不好吗?这就是你开始欣赏它的地方。) 4. 写入文件 正如你所期待的,你也能用与读取文件同样的方式写入文件。有两种基本的文件模式: • 追加 (Append) 模式将数据追加到文件尾。 如果文件还不存在,任意一种模式都将自动创建文件,因此从来不需要任何复杂的逻辑:“如果 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" 写入回车符。因为你没做这项工作,所以你写到文件的所有内容都将显示在同一行上。 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |