如何在python中找到文件末尾的行号?

时间:2015-10-05 17:13:04

标签: python

我在这里有两个问题:

1)我怎么知道它是否是文件的结尾?

2)一旦你知道文件已经到了结尾,我该如何获得行号?

要获取行号,我使用以下内容。

def get_block_range (filename, lookupValue):
with open(filename, 'r') as file:
    for num, line in enumerate(file, 1):
        if lookupValue in line:
            #print (num)
            return num

3 个答案:

答案 0 :(得分:2)

1)我怎么知道它是否是文件的结尾?

当for循环停止时,它就是文件的结尾。

2)一旦你知道文件已经到了结尾,我该如何获得行号?

只返回forloop外的最后一个num变量...

代码:

def get_block_range (filename, lookupValue):
    with open(filename, 'r') as file:
        for num, line in enumerate(file, 1):
            if lookupValue in line:
                return num
        return num

这种方式函数将返回带有lookupValue的第一行的编号或总行数。

但是如果你想总是返回具有lookupValue和行总数的行的索引,你必须这样做:

import os 

def get_block_range (filename, lookupValue):
    """
    Returns the index of the first line that contain ``lookupValue``
    and end of the file
    # here the value was at line 941 and the file had 1000 lines. 

    >>> get_block_range('example.txt', 'example')
    (941, 1000)

    :rtype: tuple
    """
    if not os.path.getsize(filename):
        return None, 0

    with open(filename, 'r') as file:
        lookup_position = None

        for num, line in enumerate(file, 1):
            if lookup_position is None and lookupValue in line:
                lookup_position = num
        return lookup_position, num

答案 1 :(得分:1)

  1. 当你走出循环时,你知道你已经到达了文件的末尾。
  2. num变量仍可在循环外部访问,并包含分配给它的最后一个值,如果在循环中找不到匹配项,则为最后一行#。

    def get_block_range (filename, lookupValue):
        with open(filename, 'r') as f:
            for num, line in enumerate(f, 1):
                if lookupValue in line:
                    return num
            return num
    

答案 2 :(得分:0)

如果你想要最后一个行号,你也可以利用文件对象作为它自己的迭代器:

def get_block_range (filename, lookupValue):
    with open(filename, 'r') as file:
        for num, line in enumerate(file, 1):
            if lookupValue in line:
                return num + sum(1 for _ in file), num
        return num, False

# unpack the return values
end_no , val_no = get_block_range ("some_filename", "some_value")
if val_no:
    # found value
else:
    .....

如果您的值不匹配,则返回最后一个行号并返回False。如果你得到一个匹配sum(1 for _ in file)将使用剩余的行,所以将它添加到当前索引将给你总行数,该函数将分别返回总量和匹配的行号。代码也将在您自己的逻辑之后的第一场比赛中停止。