Python遍历目录文件重复打印关键词行的问题求助
解决Python文件扫描脚本重复打印行的问题
看起来你遇到的重复打印问题,根源在于脚本中不必要地重复获取文件列表,以及循环变量命名不当导致的潜在混淆。让我们一步步修复这个问题:
问题分析
你的原始代码中,使用os.walk遍历目录的同时,又调用os.listdir(path)重新获取当前目录的文件——其实os.walk本身已经会在每次迭代中返回当前目录下的所有文件列表,重复获取文件可能导致同一个文件被多次处理,最终出现同一行被多次添加到列表的情况。另外,循环变量path和初始的根目录变量重名,虽然不会直接报错,但容易引发逻辑混淆。
修复后的代码
import os # 重命名根目录变量,避免和循环变量冲突 root_path = "D:\\MyFolder\\" important = [] key_phrases = ["testing example1", "testing example2"] # 使用root作为循环变量,避免覆盖初始路径 for root, subdirs, files in os.walk(root_path): # 直接从os.walk返回的files中筛选目标文件,无需重新调用os.listdir target_files = [file for file in files if file.endswith('.txt') or file.endswith('.log')] for filename in target_files: full_file_path = os.path.join(root, filename) # 添加编码参数和错误处理,避免编码问题导致脚本崩溃 with open(full_file_path, 'r', encoding='utf-8', errors='ignore') as f: for line in f: # 检查行中是否包含任意关键词 for phrase in key_phrases: if phrase in line: # 可选:strip()去掉换行符,让输出更整洁 important.append(line.strip()) break # 找到关键词后跳出循环,避免重复添加同一行 print(important)
关键修改点
- 避免变量重名:将初始根目录变量改为
root_path,循环中使用root作为当前目录的变量名,防止覆盖初始路径导致的逻辑混乱。 - 利用os.walk返回的文件列表:直接使用
os.walk提供的files列表筛选目标文件,不再调用os.listdir,确保每个文件只被处理一次。 - 添加编码处理:打开文件时指定
encoding='utf-8'并设置errors='ignore',避免遇到非UTF-8编码的文件时脚本崩溃。 - 优化行处理:使用
line.strip()去掉行尾的换行符,让最终列表的内容更整洁;找到关键词后立即break,避免同一行被多次添加。
额外建议
如果你想更清晰地看到每个匹配行来自哪个文件,可以在添加到列表时同时记录文件名,比如:
important.append(f"{full_file_path}: {line.strip()}")
这样你就能直观地知道每个匹配内容的来源啦!
内容的提问来源于stack exchange,提问作者D. Wu
相关产品推荐
相关产品推荐

