通过至少三种方法可以解决此问题的一般方法,即按行反向反向读取文本文件。
普遍的问题是,由于每行的长度可以不同,因此您无法事先知道文件中每行的起始位置,也不知道其中有多少行。这意味着您需要对问题应用一些逻辑。
通用方法#1:将整个文件读入内存
使用这种方法,您只需将整个文件读入内存中,就可以采用某种数据结构,该数据结构随后允许您反向处理行列表。堆栈,双向链表甚至数组都可以做到这一点。
优点: 真正易于实现(据我所知可能内置于Python中)
缺点: 占用大量内存,可能需要一段时间才能读取大文件
通用方法2:读取整个文件,存储行的位置
使用这种方法,您还可以读取整个文件一次,但是,不是将整个文件(所有文本)存储在内存中,而是仅将二进制位置存储在文件中每行开始的位置。您可以将这些位置存储在与第一种方法中存储行的位置相似的数据结构中。
如果您想读取X行,则必须从文件中重新读取该行,并从该行开头的存储位置开始。
优点: 几乎与第一种方法一样容易实现
缺点: 可能需要一段时间才能读取大文件
通用方法3:反向读取文件,然后“将其数字化”
使用这种方法,您将从头开始逐块或类似地读取文件,并查看两端在哪里。您基本上有一个缓冲区,例如4096个字节,并处理该缓冲区的最后一行。当必须在该缓冲区中一次向后移动一行的处理到达该缓冲区的开始时,您需要从读取的第一个缓冲区之前的区域读取另一个有价值的数据,然后继续进行处理。
这种方法通常更为复杂,因为您需要处理以下情况:行在两个缓冲区上折断,而长行甚至可能覆盖两个以上的缓冲区。
但是,这是需要最少内存的应用程序,对于真正的大文件,这样做也可能值得避免首先读取千兆字节的信息。
优点: 占用很少的内存,不需要您先阅读整个文件
缺点: 很难实现,并且适合所有极端情况
网上有许多链接显示了如何执行第三种方法:
- ActiveState Recipe 120686-向后读取文本文件
- ActiveState食谱439045-向后读取文本文件(还有另一个实现)
- Top4Download.com脚本-向后读取文本文件



