打印到文件的倒数第二行

时间:2015-05-19 11:41:49

标签: python file seek

我想知道是否有一种简单的方法可以到达打开文件的倒数第二行。 f.seek给我带来了麻烦。我可以很容易地到达最后一行,但我无法弄清楚如何到达上面那一行。

4 个答案:

答案 0 :(得分:3)

假设文件不是太大而且内存不是问题

CSV

答案 1 :(得分:2)

您可以在文件末尾搜索并计算遇到的换行数,只要您点击第二个'\n'停靠点并拨打readline()

with open('foo.txt') as f:
    end_count = 0
    n = -1
    while end_count != 2:
        f.seek(n, 2)
        if f.read(1) == '\n':
            end_count += 1
        n -= 1
    print repr(f.readline())

对于像

这样的文件
first line
second line
third line
fourth line
I want this line
last line

输出将是:

'I want this line\n'

答案 2 :(得分:2)

在大多数系统上,文件是单个长字节字符串(有些具有分支,扩展区或记录),将行的概念保留在更高级别。更复杂的是,在所有平台上,行结尾看起来并不相同。这意味着您必须读取行以识别它们,特别是对于文本文件,您只能使用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. 

答案 3 :(得分:1)

def penultimate(file_path)
    return open(file_path).read().splitlines()[len(open(file_path).read().splitlines()) - 2]