【问题标题】:Python:Detect if the current line in file read is the last onePython:检测文件读取中的当前行是否为最后一行
【发布时间】:2014-07-27 16:28:52
【问题描述】:

我正在逐行读取 Python 中的文件,我需要知道读取时哪一行是最后一行,如下所示:

 f = open("myfile.txt")
 for line in f:
    if line is lastline:
       #do smth

examples 我发现它涉及查找和完成文件读出以计数行等。我可以检测到当前行是最后一行吗?我试着去检查“\n”是否存在,但在许多情况下,最后一行后面没有反斜杠 N。

对不起,如果我的问题是多余的,因为我没有在 SO 上找到答案

【问题讨论】:

  • @vaultah 这是一个不错的技巧,但我需要在最后一行知道它是最后一行 :)
  • 所以你只对最后一行感兴趣?
  • 当你检测到它是最后一行时你会怎么做?你能把for循环之外的东西移动吗?
  • 我使用了所有的行,但我需要最后一行来附加一些不同的东西,然后再将其写入同一位置的另一个文件。我的意思是,是的,我可以在 else 中执行:之后"for in" 但是真的很乱..
  • // 不是用于评论的 Python 语法。您确定要在 python 中寻找答案吗?

标签: python


【解决方案1】:

检查is 行是否为最后一行:

with open("in.txt") as f:
    lines = f.readlines()
    last = lines[-1]
    for line in lines:
        if line is last:
            print id(line),id(last)
            # do work on lst line
        else:
            # work on other lines

如果你想要倒数第二行,请使用last = lines[-2]

或者简单地说:

with open("in.txt") as f:
    lines = f.readlines()
    last = lines[-1]
    for line in lines[:-1]:
        # work on all but last line
    # work on last

【讨论】:

  • 您的解决方案很糟糕,因为它会将整个文件加载到内存中,并且对于足够大的文件,它只会segfault
  • @DenisMalinovsky,OP 在哪里说文件很大?
  • 你说得对,OP 说“我正在逐行读取 Python 中的文件”,而不是同时读取每一行。
【解决方案2】:
import os
path = 'myfile.txt'
size = os.path.getsize(path)
with open(path) as f:
    for line in f:
        size -= len(line)
        if not size:
            print('this is the last line')
            print(line)

这是一个替代解决方案,以防它是一个非常大的文件,需要很长时间才能遍历。使用seek 从头到尾反向读取文件。它假定文件不是二进制文件且未压缩,并且至少有一个换行符,并且最后一个字符是换行符。

import os
path = 'myfile.txt'
size = os.path.getsize(path)
with open(path) as f:
    for i in range(1, size):
        f.seek(size - 1 - i)
        if f.read(1) == '\n':
            print('This is the last line.:')
            last_line = f.read()
            print(last_line)
            break

【讨论】:

  • @ThorbjørnRavnAndersen 好点。它不是。您需要改用size -= len(line) + 1。这是关于如何识别换行符类型的答案:stackoverflow.com/a/2800981/778533
  • 这是我见过的最好的答案,因为您不必两次读取文件,或者将整个文件加载到内存中。请注意,如果您使用 open() 并将 errors 参数设置为类似 'ignore''backslashescape' ,则每行的读取大小总计不会达到操作系统报告的文件大小。
  • 非常好的解决方案,非常适合我只需要阅读最后一行的大型转储文件。
【解决方案3】:
secondLastLine = None
lastLine = None
with open("myfile.txt") as infile:
    secondLastLine, lastLine = infile.readline(), infile.readline()
    for line in infile:
        # do stuff
        secondLastLine = lastLine
        lastLine = line

# do stuff with secondLastLine

【讨论】:

  • 可能是最简单的方法。
【解决方案4】:

您可以尝试的一件事是尝试获取下一行,并在出现异常时捕获异常,因为 AFAIK python 迭代器没有内置 hasNext 方法。

【讨论】:

    【解决方案5】:

    这是一个老问题,但如果你想允许最后一行是空的,这更好:

    with open("myfile.txt") as f:
        while True:
            line = f.readline()
            # do smth
            if line[-1:] != '\n':
                # do smth with the last line
                break
    

    或更具可读性:

    with open("myfile.txt") as f:
        while True:
            line = f.readline()
            # do smth
            if not line.endswith('\n'):
                # do smth with the last line
                break
    

    【讨论】:

      【解决方案6】:

      你可以使用itertools pairwise recipe;

      with open('myfile.txt') as infile:
          a,b = itertools.tee(infile)
          next(b, None)
          pairs = zip(a,b)
          lastPair = None
          for lastPair in pairs:
              pass
      secondLastLine = lastPair[0]
      # do stuff with secondLastLine
      

      【讨论】:

        【解决方案7】:

        只检查 f.readline() 的输出,当文件中没有更多行时,它应该是空字符串。

        阿尔贝托。

        【讨论】:

          【解决方案8】:

          也许这对某人有帮助

          fp = open("somefile.txt", "r")
          temp = fp.readline()
          
          while True:
              print(temp)
              # other stuff
              
              temp = fp.readline()
              if not temp:
                  print("last")
                  # other last line logic
                  break
          
          fp.close()
          

          【讨论】:

            猜你喜欢
            • 2021-06-29
            • 2011-10-18
            • 1970-01-01
            • 2021-06-06
            • 1970-01-01
            • 2018-02-25
            • 1970-01-01
            相关资源
            最近更新 更多