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

使用enumerate()循环遍历文件时,如何跳转至文件开头查找函数

解决方案

方法一:先建立函数与行号的映射(推荐)

先一次性遍历文件,把所有含void的函数声明和对应行号存入字典,之后直接遍历函数列表查字典即可,不管顺序如何都能精准匹配,效率更高。

代码示例:

def enumerate_item():
    file_path = current_directory + r"\D_Out_Clean\\" + list_file_name[id]
    func_line_map = {}
    
    # 遍历文件,建立函数到行号的映射表
    with open(file_path, "r") as f_iat:
        for num, line in enumerate(f_iat, start=1):
            if 'void ' in line:
                # 从行内容中提取函数名
                func_name = line.split('void ')[1].split()[0]
                func_line_map[func_name] = num
    
    # 按列表顺序查找对应行号
    for func_name in list_func_name:
        if func_name in func_line_map:
            print(f"Found item {func_name} at line: {func_line_map[func_name]}")
        else:
            print(f"Item {func_name} not found in file")

方法二:手动跳转文件开头

如果要保留逐次查找并回退的逻辑,可以用文件对象的seek(0)方法将文件指针重置到开头,重新遍历文件。但这种方法会多次遍历文件,效率较低。

代码示例:

def enumerate_item():
    file_path = current_directory + r"\D_Out_Clean\\" + list_file_name[id]
    p = 0
    with open(file_path, "r") as f_iat:
        while p < len(list_func_name):
            target_func = list_func_name[p]
            # 每次查找前将文件指针移回开头
            f_iat.seek(0)
            found = False
            for num, line in enumerate(f_iat, start=1):
                if f'void {target_func}' in line:
                    print(f"Found item {target_func} at line: {num}")
                    p += 1
                    found = True
                    break
            if not found:
                print(f"Item {target_func} not found in file")
                p += 1

原脚本问题分析

  • 原脚本按文件顺序遍历,同时按列表顺序查找函数,当文件中函数顺序与列表不一致时(比如func_3在func_4之后),找到func_2后继续往后找func_3,会跳过func_4;找到func_3后,文件已经遍历到末尾,无法再回头找func_4。
  • 重置num变量无效,因为enumerate基于文件迭代器,文件指针已经移动到当前行,必须用seek(0)才能让文件回到开头重新遍历。

内容的提问来源于stack exchange,提问作者Redal_Snake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:00:27