使用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
相关产品推荐
相关产品推荐

