如何从文件末尾开始读取Python中的行
我想知道怎么用Python从文件中读取行,要求是先读取最后一行,然后再往前读取,直到到达文件的开头。有没有什么好的方法?
5 个回答
你还可以使用一个叫做 file_read_backwards 的 Python 模块。这个模块可以有效地利用内存来读取文件。它适用于 Python 2.7 和 3 的版本。
它支持“utf-8”、“latin-1”和“ascii”这几种编码方式。对于换行符,它可以处理“\r”、“\n”和“\r\n”。
安装这个模块很简单,你只需要通过 pip install file_read_backwards
(版本是 1.2.1)来安装。安装后,你就可以通过以下代码来反向读取整个文件(按行读取):
#!/usr/bin/env python2.7
from file_read_backwards import FileReadBackwards
with FileReadBackwards("/path/to/file", encoding="utf-8") as frb:
for l in frb:
print l
更多的使用说明可以在这里找到:http://file-read-backwards.readthedocs.io/en/latest/readme.html
这个问题的总体思路是,按行反向读取文本文件,至少可以通过三种方法来解决。
这个问题的关键在于每一行的长度可能不同,所以你无法提前知道每一行在文件中的起始位置,也不知道总共有多少行。这就需要你对问题进行一些逻辑处理。
方法一:将整个文件读入内存
这种方法很简单,你只需将整个文件读入内存,使用某种数据结构来处理这些行的反向顺序。可以用栈、双向链表,甚至数组来实现。
优点:实现起来非常简单(我想Python可能已经内置了这个功能)
缺点:占用大量内存,读取大文件时可能需要一些时间
方法二:读取整个文件,存储行的位置
这种方法也是一次性读取整个文件,但不是将整个文件(所有文本)存入内存,而是只存储每一行在文件中开始的位置的二进制数据。你可以用类似于第一种方法的数据结构来存储这些位置。
每当你想读取某一行时,就需要从文件中重新读取该行,从你存储的起始位置开始。
优点:实现起来几乎和第一种方法一样简单
缺点:读取大文件时可能需要一些时间
方法三:反向读取文件,并“自己解决”
这种方法是从文件的末尾开始,按块读取,看看每一行的结束位置。你基本上有一个缓冲区,比如说4096字节,处理这个缓冲区的最后一行。当你的处理从缓冲区的最后一行向前移动时,如果到达缓冲区的开头,就需要从你读取的第一个缓冲区之前的区域再读取一个缓冲区的数据,继续处理。
这种方法通常更复杂,因为你需要处理一些情况,比如行可能跨越两个缓冲区,而长行甚至可能覆盖超过两个缓冲区。
不过,这种方法所需的内存最少,对于非常大的文件,这样做可能更合适,以避免先读取几GB的信息。
优点:占用内存少,不需要先读取整个文件
缺点:实现起来更难,需要处理各种边界情况
网上有很多链接展示了如何实现第三种方法: