如何获取Python项目各文件中代码的缩进层级相关数据
获取Python源文件缩进层级数据的方法
你需要的缩进栈数据(也就是示例中方括号内的层级空格数)可以通过静态分析Python源文件获取,核心依赖Python标准库自带的tokenize模块,它完全遵循官方缩进解析规则,可以直接输出INDENT/DEDENT记号及对应的空格数,无需额外第三方依赖。
具体实现逻辑
- 遍历目标Python项目的
.py源文件,以二进制模式读取文件内容,避免编码异常 - 用
tokenize.tokenize()方法解析文件的字节流,识别三类核心记号:INDENT:遇到缩进时,将当前缩进的空格数压入栈DEDENT:遇到取消缩进时,弹出栈顶的缩进值NEWLINE:逻辑行结束时,当前的缩进栈就是该行对应的层级数组,可直接记录
- 最后将每行代码对应的缩进栈关联存储即可。
参考实现代码
import tokenize from io import BytesIO import os def get_file_indent_info(file_path: str): with open(file_path, 'rb') as f: indent_stack = [0] result = [] current_line = "" for token in tokenize.tokenize(f.readline): tok_type, tok_str, _, _, line = token if tok_type == tokenize.INDENT: indent_stack.append(len(tok_str)) elif tok_type == tokenize.DEDENT: indent_stack.pop() elif tok_type == tokenize.NEWLINE: if current_line.strip(): result.append((current_line.strip(), indent_stack.copy())) current_line = "" else: if not current_line: current_line = line if current_line.strip(): result.append((current_line.strip(), indent_stack.copy())) return result # 单文件测试 test_code = """if foo: if bar: x = 42 else: print(foo) """ # 临时写入测试文件 with open("test.py", "w", encoding="utf-8") as f: f.write(test_code) for line, stack in get_file_indent_info("test.py"): print(f"{line:<20} {stack}")
运行上述代码输出的缩进栈和你示例中的数据完全匹配。
批量处理项目的扩展方案
如果需要扫描整个Python项目,补充文件遍历逻辑即可:
- 用
os.walk递归遍历项目目录,筛选所有后缀为.py的文件 - 逐个调用上述方法解析文件,将结果输出为JSON、CSV等格式存储,方便后续分析使用
内容的提问来源于stack exchange,提问作者Avah
相关产品推荐
相关产品推荐

