在大多数系统(有些系统有分叉、扩展或记录)上,文件是一长串字节,将行的概念留给了更高的层次。更复杂的是,行尾在所有平台上看起来都不一样。这意味着您必须阅读这些行来识别它们,特别是对于文本文件,您只能通过 seek() 找到使用 tell() 找到的位置。
如果我们只是阅读倒数第二行,那很简单:
alllines=fileobject.readlines()
penultimateline=alllines[-2]
这种方法将整个文件加载到内存中。如果我们想替换文件的结尾,从倒数第二行开始,事情会变得更复杂:
pen,last = 0,0
while True:
last,pen = fileobject.tell(), last
line = fileobject.readline()
if not line:
break
# back up to the penultimate line
fileobject.seek(pen) # Note: seek is *required* to switch read/write
fileobject.truncate()
fileobject.write("Ate last two lines, this is a new line.\n")
如果您只想按任意顺序读取行,linecache 可能会有所帮助。
每个都扫描整个文件。 tail 之类的工具可能会进行另一项优化:读取文件末尾附近的数据,直到找到足够的换行符来识别所需的行。这变得更加复杂,因为搜索只能在二进制模式下可预测地工作,而行解析只能在文本模式下可预测地工作。这反过来意味着我们猜测文件由linesep分隔可能是错误的; Python 的通用换行支持仅在文本模式下运行。
backsearch=0
lines=[]
while len(lines)<=2:
backsearch+=200
fileobject.seek(-backsearch, 2)
if fileobject.tell()==0:
break # ran out of file while scanning backwards
lines=fileobject.read().split(os.linesep)
fileobject.seek(-backsearch, 2)
# Now repeat the earlier method, knowing you're only processing
# the final part of the file.