2007-07-04
Python Cookbook 2.1 文件读操作
需求:
想从一个文件中读文本或者二进制数据.
讨论:
下面是比较方便的方法,一次把所有的数据读入长字符串中:
all_the_text = open(' thefile.txt').read( ) # all text from a text file
all_the_data = open('abinfile', 'rb').read( ) # all data from a binary file
当然,比较好的做法是绑定一个文件对象,这样你在操作完的时候,可以关闭它,举例说明,对于文本文件:
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )
在这里并不是必须要使用try/finally语句,不过最好这样写,这样保证了即使在读的时候发生异常,文件也能关闭.
最简单,最快捷,也最Python的方式来把文件读到多行字符串的方法是:
list_of_all_the_lines = file_object.readlines( )
这样在每行的结束有一个'\n',如果你不需要它,使用下面的方法:
list_of_all_the_lines = file_object.read( ).splitlines( )
list_of_all_the_lines = file_object.read( ).split('\n')
list_of_all_the_lines = [L.rstrip('\n') for L in file_object]
最简单快捷的一行行的处理文件的方法是使用for循环:
for line in file_object:
process line
这种方法在每行结束也有一个'\n',你可以在for循环体中处理它:
line = line.rstrip('\n')
或者说,你希望处理多余的空格,可以使用:
line = line.rstrip()
除非你要处理的文件非常大(大于内存),一次性读入到内存中是最方便也是最快捷的方法.内建的open函数创建了一个文件对象 (可以理解为file类型),使用read方法把内容(不管文本还是字符串)读到一个长字符串中,如果文件的内容是文本,你可以使用split方法把它分割,或者使用splitlines,还有更方便的方法,就是使用readlines直接从文件中读取.
你也可以对文件对象使用迭代处理,当用这样的方式处理时,每一行都是迭代的对象(注意,仅适用于文本模式),这种方式比较省内存,速度也比较快.
在Unix系统和其它类Unix系统中,文本文件和二进制文件是没有什么实际的差别的.而在windows系统和老式的Macintosh系统中 ,换行符被编码了,不是标准的'\n',而是'\r\n'或者'\r',Python在你处理这些文件时,已经将他们替换为'\n',这就意味着你需要告诉Python,在处理二进制文件时,不要做这样的转换.采用二进制方式,只要在open的第二个参数中写入'rb'就可以了,在Unix系统中,这样做也无伤大雅,因为得到的效果是相同的.而且增加了代码的可读性,还提高了平台的兼容性.
如果你不确定文件的换行符到底是什么,可以使用'rU'做为open的第二个参数,这样就不用再考虑平台或者文件的换行符了.因为任何换行符总是被替换为'\n'.
你可以在使用完open方法后立刻调用read方法,这样的话,一但文件读操作完成,file对象的引用就立刻消亡.在实际中,一旦Python发现文件对象引用消失,它就立刻关闭文件.然而,比较好的方式还是让保存open的返回值,这样你可以在自己需要的时候关闭文件.这保证了文件对象存在的时间是最精确的 ,为了保证文件总是能关闭,比较好的方式是使用try/finally语句:
file_object = open('thefile.txt')
try:
for line in file_object:
process line
finally:
file_object.close( )
切记不要把open放在try语句里面(初学者很容易犯的错误),如果在open的时候发生异常,file_object不会绑定文件对象,所以也没有对象去关闭,所以,不要把open写在try里面.
如果你想一次读一部分字节,而不是全读入,方式有一些区别,下面是一个例子,一次处理100个字节:
file_object = open('abinfile', 'rb')
try:
while True:
chunk = file_object.read(100)
if not chunk:
break
do_something_with(chunk)
finally:
file_object.close( )
将N做为read的参数,保证了一次只读入N个字节(或者更少,看文件剩下多少个字节了),当到文件末尾时,read返回一个空字符串.复杂的for循环最好封装在一个生成器中,当然,我们可以进行部分的封装,因为yield不能用在try/finally语句中:
def read_file_by_chunks(filename, chunksize=100):
file_object = open(filename, 'rb')
while True:
chunk = file_object.read(chunksize)
if not chunk:
break
yield chunk
file_object.close( )
一旦生成器构造好了,使用起来是相当方便的:
for chunk in read_file_by_chunks('abinfile'):
do_something_with(chunk)
一次处理一行文本是很常见的,对文件对象进行循环操作就可以了:
for line in open('thefile.txt', 'rU'):
do_something_with(line)
当然,为了100%保证在使用完毕的时候,文件对象可以被关闭,需要使用try/finally语句:
file_object = open('thefile.txt', 'rU'):
try:
for line in file_object:
do_something_with(line)
finally:
file_object.close( )
相关说明:
open(...)
open(name[, mode[, buffering]]) -> file object
Open a file using the file() type, returns a file object.
file.read(...)
read([size]) -> read at most size bytes, returned as a string.
If the size argument is negative or omitted, read until EOF is reached.
Notice that when in non-blocking mode, less data than what was requested
may be returned, even if no size parameter was given.
file.readlines (...)
readlines([size]) -> list of strings, each a line from the file.
Call readline() repeatedly and return a list of the lines so read.
The optional size argument, if given, is an approximate bound on the
total number of bytes in the lines returned.
想从一个文件中读文本或者二进制数据.
讨论:
下面是比较方便的方法,一次把所有的数据读入长字符串中:
all_the_text = open(' thefile.txt').read( ) # all text from a text file
all_the_data = open('abinfile', 'rb').read( ) # all data from a binary file
当然,比较好的做法是绑定一个文件对象,这样你在操作完的时候,可以关闭它,举例说明,对于文本文件:
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )
在这里并不是必须要使用try/finally语句,不过最好这样写,这样保证了即使在读的时候发生异常,文件也能关闭.
最简单,最快捷,也最Python的方式来把文件读到多行字符串的方法是:
list_of_all_the_lines = file_object.readlines( )
这样在每行的结束有一个'\n',如果你不需要它,使用下面的方法:
list_of_all_the_lines = file_object.read( ).splitlines( )
list_of_all_the_lines = file_object.read( ).split('\n')
list_of_all_the_lines = [L.rstrip('\n') for L in file_object]
最简单快捷的一行行的处理文件的方法是使用for循环:
for line in file_object:
process line
这种方法在每行结束也有一个'\n',你可以在for循环体中处理它:
line = line.rstrip('\n')
或者说,你希望处理多余的空格,可以使用:
line = line.rstrip()
除非你要处理的文件非常大(大于内存),一次性读入到内存中是最方便也是最快捷的方法.内建的open函数创建了一个文件对象 (可以理解为file类型),使用read方法把内容(不管文本还是字符串)读到一个长字符串中,如果文件的内容是文本,你可以使用split方法把它分割,或者使用splitlines,还有更方便的方法,就是使用readlines直接从文件中读取.
你也可以对文件对象使用迭代处理,当用这样的方式处理时,每一行都是迭代的对象(注意,仅适用于文本模式),这种方式比较省内存,速度也比较快.
在Unix系统和其它类Unix系统中,文本文件和二进制文件是没有什么实际的差别的.而在windows系统和老式的Macintosh系统中 ,换行符被编码了,不是标准的'\n',而是'\r\n'或者'\r',Python在你处理这些文件时,已经将他们替换为'\n',这就意味着你需要告诉Python,在处理二进制文件时,不要做这样的转换.采用二进制方式,只要在open的第二个参数中写入'rb'就可以了,在Unix系统中,这样做也无伤大雅,因为得到的效果是相同的.而且增加了代码的可读性,还提高了平台的兼容性.
如果你不确定文件的换行符到底是什么,可以使用'rU'做为open的第二个参数,这样就不用再考虑平台或者文件的换行符了.因为任何换行符总是被替换为'\n'.
你可以在使用完open方法后立刻调用read方法,这样的话,一但文件读操作完成,file对象的引用就立刻消亡.在实际中,一旦Python发现文件对象引用消失,它就立刻关闭文件.然而,比较好的方式还是让保存open的返回值,这样你可以在自己需要的时候关闭文件.这保证了文件对象存在的时间是最精确的 ,为了保证文件总是能关闭,比较好的方式是使用try/finally语句:
file_object = open('thefile.txt')
try:
for line in file_object:
process line
finally:
file_object.close( )
切记不要把open放在try语句里面(初学者很容易犯的错误),如果在open的时候发生异常,file_object不会绑定文件对象,所以也没有对象去关闭,所以,不要把open写在try里面.
如果你想一次读一部分字节,而不是全读入,方式有一些区别,下面是一个例子,一次处理100个字节:
file_object = open('abinfile', 'rb')
try:
while True:
chunk = file_object.read(100)
if not chunk:
break
do_something_with(chunk)
finally:
file_object.close( )
将N做为read的参数,保证了一次只读入N个字节(或者更少,看文件剩下多少个字节了),当到文件末尾时,read返回一个空字符串.复杂的for循环最好封装在一个生成器中,当然,我们可以进行部分的封装,因为yield不能用在try/finally语句中:
def read_file_by_chunks(filename, chunksize=100):
file_object = open(filename, 'rb')
while True:
chunk = file_object.read(chunksize)
if not chunk:
break
yield chunk
file_object.close( )
一旦生成器构造好了,使用起来是相当方便的:
for chunk in read_file_by_chunks('abinfile'):
do_something_with(chunk)
一次处理一行文本是很常见的,对文件对象进行循环操作就可以了:
for line in open('thefile.txt', 'rU'):
do_something_with(line)
当然,为了100%保证在使用完毕的时候,文件对象可以被关闭,需要使用try/finally语句:
file_object = open('thefile.txt', 'rU'):
try:
for line in file_object:
do_something_with(line)
finally:
file_object.close( )
相关说明:
open(...)
open(name[, mode[, buffering]]) -> file object
Open a file using the file() type, returns a file object.
file.read(...)
read([size]) -> read at most size bytes, returned as a string.
If the size argument is negative or omitted, read until EOF is reached.
Notice that when in non-blocking mode, less data than what was requested
may be returned, even if no size parameter was given.
file.readlines (...)
readlines([size]) -> list of strings, each a line from the file.
Call readline() repeatedly and return a list of the lines so read.
The optional size argument, if given, is an approximate bound on the
total number of bytes in the lines returned.
标签: Python