文章来自《Python cookbook》.

翻译仅仅是为了个人学习,其它商业版权纠纷与此无关!

-- v_gyc [2004-09-19 22:05:29]

描述

读取文件内容

Credit: Luther Blissett

问题

从文件读取文本或数据

解决

一次将文件内容读入一个长字符串的最简便方法

   1 all_the_text = open('thefile.txt').read(  )    # 文本文件的全部文本
   2 all_the_data = open('abinfile', 'rb').read(  ) # 2进制文件的全部数据

更好的方法是将文件对象和一个变量绑定,可以及时关闭文件。比如,读取文本文件内容:

   1 file_object = open('thefile.txt')              # 打开文件
   2 all_the_text = file_object.read(  )            # 文本文件的全部文本
   3 file_object.close(  )                          # 使用完毕,关闭文件

将文本文件的全部内容按照分行 作为一个list读出有4种方法:

   1 list_of_all_the_lines = file_object.readlines(  )             # 方法 1
   2 list_of_all_the_lines = file_object.read(  ).splitlines(1)    # 方法 2
   3 list_of_all_the_lines = file_object.read().splitlines(  )     # 方法 3 
   4 list_of_all_the_lines = file_object.read(  ).split('\n')      # 方法 4 

方法1、2 返回的list中包含的string 元素末尾有'\n', 方法3、4 返回的list中包含的string元素末尾去掉了‘\n’.

方法1是效率最高的,而且最符合python的风格。

在Python 2.2以及更高版本中,有方法5和方法1等效

   1 list_of_all_the_lines = list(file_object)                     # 方法 5 

讨论

如果文件大小不是特别大,那么一次将文件内容全部读出是最快的,一般来说对于以后文件内容的处理也是最方便的。

内置函数 open,打开文件并返回一个文件对象实例。 可以调用read方法读取文件内容(文本或2进制)到一个大字符串。

如果是文本内容,可以使用stringsplit方法或者特别的splitlines方法将此string分解成文本行的list

经常进行文件内容按行分解,可以直接调用文件对象的readlines方法,更方便更快捷。:)。

在Python 2.2以及更高版本中,可以直接将文件对象实例作为内置list函数的唯一参数。

在Unix 以及类Unix系统,比如Linux和BSD的各种变体中,文本文件和2进制文件没有实质的区别。

在Windows和Macintosh系统中,文本文件中的分行符不是标准的'\n'分隔符,分别是'\r\n'和'\r'。

打开文本文件时,Python会自动用'\n'替换相应的分隔符。

因此, 打开2进制文件不需要这种自动替换时,必须通知Python: open打开文件时第2个参数使用rb

在类Unix平台上使用rb参数也没有什么坏处。 虽然不是必须的,但是区分文本文件和2进制文件是一个好习惯,可以使程序易于理解,同时具有较好的跨平台性。

你可以直接在open函数获得的文件对象上调用文件的方法比如read(象第一个程序片断中). 当方法调用结束时,你不再拥有被打开文件对象的引用。 实际上,Python 检测到这个文件对象没有被引用, 会马上关闭这个文件对象。 然而,更佳的做法是持有一个open返回的文件对象的引用, 这样当结束处理文件时, 可以自己显式关闭文件。 这可以保证文件被打开的时间尽可能的短, 即使在Jython和以后的Python版本中由于拥有更先进的垃圾回收机制可能延缓自动关闭文件功能时, 自己关闭文件也是有效的。

如果不是需要读取全部文件内容, 而是每次读取文件的部分内容, 习惯方法是不同的。

下面的程序片断显示了如何从文件中每次读取100字节,一直到文件末尾:

   1 file_object = open('abinfile', 'rb')
   2 while 1:
   3     chunk = file_object.read(100)
   4     if not chunk: break
   5     do_something_with(chunk)
   6 file_object.close(  )

read方法中使用参数N, 保证read只返回N字节(如果接近文件末尾,可能更少)。 当到达文件末尾时,read返回一个 字符串.

每次读取文件的一行是个常见任务。在Python2.2以及更高版本中最简单、最明了、最快的方法如下:

   1 for line in open('thefile.txt'):
   2     do_something_with(line)

在Python早期版本中有多种方法一次读取一行。即使在特别古老的Python版本如1.5.2中也可以保证运行的方法同2进制文件块读取操作很接近,代码如下:

   1 file_object = open('thefile.txt')
   2 while 1:
   3     line = file_object.readline(  )
   4     if not line: break
   5     do_something_with(line)
   6 file_object.close(  )

readlineread 一样, 在文件末尾返回空字符串。注意文件末尾和空行很容易区分,readline对于空行返回'\n'. '\n'不是空字符串,而是长度为1的字符串。

参考

食谱 4.3; [ http://wiki.woodpecker.org.cn/moin.cgi/PyCkBk_2d4_2d3#preview]

Python 文档 内置函数 open 和 file 对象部分

PyCkBk-4-2 (last edited 2009-12-25 07:16:21 by localhost)