如何获取 python 文件中所有 'if' 'else' 和 'elif' 位置的行号

How to fetch line numbers for all 'if' 'else' and 'elif' positions in a python file

示例:假设我们有一个包含以下代码片段的 .py 文件。我们如何读取和提取if-elif-else

的位置
If fisrtconditon:#line 1
    If sub-condition:#line2
       print(line no 3)
elif secnd_condn:#line 4
     Xyz..#line5
     Xyz..#line6
elif third condition:line7
     ...line 8
else:#line 9
    Some content #line10***

输出:

[1,4,7,9]

您可以使用 ast 模块。

import ast

with open('file.py') as f:
    tree = ast.parse(f.read())  # parse the file

for node in ast.walk(tree):  # walk the tree
    if isinstance(node, ast.If):  # if the node is an If (or an If-else)
        print('If at line', node.lineno)  # print the line number
        if node.orelse:  # if the node has an else
            if isinstance(node.orelse[0], ast.If):  # if the else is an If
                print('Elif at line', node.orelse[0].lineno)  # print the line number
            else:
                print('Else at line', node.orelse[0].lineno)  # print the line number

ast 是标准库的一部分,因此无需安装任何东西。它代表抽象语法树,代表代码的结构。您可以在 ast module documentation.

中找到更多信息

下面的片段应该可以做到:)

#!/usr/bin/env python
# get_lines.py

def get_lines():
    lines = []
    with open('file.py') as f:
        f = f.readlines()
    for line in range(len(f)):
        if f[line].startswith(('if', 'elif', 'else')):
            lines.append(line + 1)
    return lines


if __name__ == '__main__':
    print(get_lines())

一个简单的解决方案是遍历文件的行,使用 enumerate 来帮助您获取行号:

with open("somefile.py") as f:
    for line_no, line in enumerate(f, start = 1):
        if line[:2] ==  "if" and (line[2].isspace() or line[2] == "("):
            print(line_no, "if")
        elif line[:4] == "elif" and (line[4].isspace() or line[4] == "("):
            print(line_no, "elif")
        elif line[:4] == "else" and (line[4].isspace() or line[4] == ":"):
            print(line_no, "else")

假设:这个程序假设somefile.py有正确的语法。此外,如果此 if 语句出现缩进,例如,在函数定义内,它将不起作用。问题的规范没有规定此要求。

这个节目

  • 打开文件"somefile.py"进行阅读(open的默认模式);
  • 遍历文件的行,使用 enumerate 获取索引;默认情况下,索引将从 0 开始,但我们指定 start 参数,以便它从 1;
  • 开始
  • 如果该行以 if 加(空白字符或左括号)或 elif 加(空白字符或左括号)或 else 加(冒号 : 或空白字符),然后我们打印行号以及相应的 ifelifelse.
  • 当我们退出 with 块时,Python 会为我们关闭文件。

例子


如果somefile.py

if condition:
    if condition:
        something
elif condition:
    something
    something
elif condition:
    something
else:
    something

那么上面的程序输出

1 if
4 elif
7 elif
9 else

one-liner:

indexes = [x+1 for x in range(len(content)) if any(x in ['if', 'elif', 'else'] for x in [list(content[x].lower().replace('#line',' ').replace(':',' ').split(' '))[0]])]

索引:

[1, 4, 7, 9]