解决python疑难杂症python—文件迭代操作,教你读取文件的多种方法

宿舍 2019-10-22

解决python疑难杂症python—文件迭代操作,教你读取文件的多种方法

要读取一个文件有很多种方式:按字节数读取、按行读取、按段落读取、一次性全部读取等等。如果不是深入的操作文件数据,按行读、写是最通用的方式。

以下是下面测试时使用的文件a.txt的内容:

1 first line
2 second line
3 third line

在Python中,readline()函数可以一次读取一行,且每次都是前进式的读取一行,读到文件结尾的时候会返回空字符串。

>>> f = open(‘a.txt‘)
>>> f.readline()
‘first line\n‘
>>> f.readline()
‘second line\n‘
>>> f.readline()
‘third line\n‘
>>> f.readline()
‘‘

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(),也能进行迭代:

>>> f = open("a.txt")
>>> next(f)
‘first line\n‘
>>> next(f)
‘second line\n‘
>>> next(f)
‘third line\n‘
>>> next(f)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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去读取文件,并:

>>> f=open(‘a.txt‘)
>>> while True:
... line = f.readline()
... if not line: break
... print(line,end=‘‘)
...
first line
second line
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‘)

相关推荐