如何获取 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
加(冒号 :
或空白字符),然后我们打印行号以及相应的 if
、elif
或 else
.
- 当我们退出
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]
示例:假设我们有一个包含以下代码片段的 .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
加(冒号:
或空白字符),然后我们打印行号以及相应的if
、elif
或else
. - 当我们退出
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]