要读取一个文件有很多种方式:按字节数读取、按行读取、按段落读取、一次性全部读取等等。如果不是深入的操作文件数据,按行读、写是最通用的方式。
以下是下面测试时使用的文件a.txt的内容:
1 first line 2 second line 3 third line
在Python中,readline()函数可以一次读取一行,且每次都是前进式的读取一行,读到文件结尾的时候会返回空字符串。
1 >>> f = open(‘a.txt‘) 2 >>> f.readline() 3 ‘first line\n‘ 4 >>> f.readline() 5 ‘second line\n‘ 6 >>> f.readline() 7 ‘third line\n‘ 8 >>> f.readline() 9 ‘‘
readline()的操作就像是有一个指针,每次读完一行就将指针指向那一行的后面做下标记,以便下次能从这里开始继续向后读取一行。
除了readline(),open()打开的文件对象还有另一种方式next()可以一次向前读取一行,只不过next()在读取到文件结尾的时候不是返回空字符串,而是直接抛出迭代异常:
在学习过程中有什么不懂得可以加我的 python学习交流扣扣qun,××× 群里有不错的学习视频教程、开发工具与电子书籍。 与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容 1 >>> f = open("a.txt") 2 >>> f.__next__() 3 ‘first line\n‘ 4 >>> f.__next__() 5 ‘second line\n‘ 6 >>> f.__next__() 7 ‘third line\n‘ 8 >>> f.__next__() 9 Traceback (most recent call last): 10 File "<stdin>", line 1, in <module> 11 StopIteration
内置函数next()会自动调用next(),也能进行迭代:
1 >>> f = open("a.txt") 2 >>> next(f) 3 ‘first line\n‘ 4 >>> next(f) 5 ‘second line\n‘ 6 >>> next(f) 7 ‘third line\n‘ 8 >>> next(f) 9 Traceback (most recent call last): 10 File "<stdin>", line 1, in <module> 11 StopIteration
要想再次读取这个文件,只能先重置这个指针,比如重新打开这个文件可以重置指针。
open()打开的文件是一个可迭代对象,它有next(),它可以被for/in等迭代工具来操作,例如:
1 >>> ‘first line\n‘ in open(‘a.txt‘) 2 True
所以更好的按行读取文件的方式是for line in open(‘file‘),不用刻意使用readline()等函数去读取。
1 >>> for line in open(‘a.txt‘): 2 ... print(line,end=‘‘) 3 ... 4 first line 5 second line 6 third line
上面的print()设置了end=‘‘,因为读取每一行时会将换行符也读入,而print默认是自带换行符的,所以这里要禁止print的终止符,否则每一行后将多一空行。
上面使用for line in open(‘a.txt‘)的方式是最好的,它每次只读一行到内存,在需要读下一行的时候再去文件中读取,直到读完整个文件也都只占用了一行数据的内存空间。
也可以使用while去读取文件,并:
1 >>> f=open(‘a.txt‘) 2 >>> while True: 3 ... line = f.readline() 4 ... if not line: break 5 ... print(line,end=‘‘) 6 ... 7 first line 8 second line 9 third line
在Python中,使用for一般比while速度更快,它是C写的,而while是Python虚拟机的解释代码。而且,for一般比while要更简单,而往往Python中的简单就意味着高效。
此外,还可以使用readlines()函数(和readline()不同,这是复数形式),它表示一次性读取所有内容到一个列表中,每一行都是这个大列表的一个元素。
1 >>> lines = open(‘a.txt‘).readlines() 2 >>> lines 3 [‘first line\n‘, ‘second line\n‘, ‘third line\n‘]
因为存放到列表中了,所以也可以迭代readlines()读取的内容:
1 >>> for line in open(‘a.txt‘).readlines(): 2 ... print(line,end=‘‘) 3 ... 4 first line 5 second line 6 third line
这种一次性全部读取的方式在大多数情况下并非良方,如果是一个大文件,它会占用大量内存,甚至可能会因为内存不足而读取失败。
但并非必须要选择for line in open(‘a.txt‘)的方式,因为有些时候必须加载整个文件才能进行后续的操作,比如要排序文件,必须要拥有文件的所有数据才能进行排序。而且对于小文件来说,一次性读取到一个列表中操作起来可能会更加方便,因为列表对象有很多好用的方法。所以,不能一概而论地选择for line in open(‘a.txt‘)。