You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:36:07