遍历目录文件并根据关键词写入新DataFrame的问题求助
问题描述
遍历目录下所有文件,当文件中出现特定字符串时,在新的DataFrame的列中写入“Yes”或“No”。第一段代码可正常根据words_in_file中的关键词是否存在,在终端打印“Yes”或“No”,但第二段尝试将结果写入DataFrame的代码无法正常工作。
第一段可运行的代码:
import pandas as pd import numpy as np from Byron import copy_to_processor_directory from pip import qualify_file_name, FileCompare, normalize_file_extension from pep.settings import WORKSPACE_ROOT, ACCOUNT_HOME import sys import os file_results = pd.DataFrame() file_results['test_case_found'] = '' words_in_file = ['remote_directory', 'file_path'] def main(): for subdir, dirs, files in os.walk(ACCOUNT_HOME): for file in files: directory_files = open(os.path.join(subdir, file), 'r') directory_file_code = directory_files.read() for key_word in words_in_file: if key_word in directory_file_code: print('yes') else: print('No') file_results.to_csv('test.csv', index=False) if __name__ == '__main__': main()
无法正常写入DataFrame的第二段代码:
import pandas as pd import numpy as np from Byron import copy_to_processor_directory from pip import qualify_file_name, FileCompare, normalize_file_extension from pep. settings import WORKSPACE_ROOT, ACCOUNT_HOME import sys import os file_results = pd.DataFrame() file_results['test_case_found'] = '' words_in_file = ['remote_directory', 'file_path'] def main(): for subdir, dirs, files in os.walk(ACCOUNT_HOME): for file in files: directory_files = open(os.path.join(subdir, file), 'r') directory_file_code = directory_files.read() for key_word in words_in_file: if key_word in directory_file_code: print('yes') file_results['test_case_found'] = 'Yes' else: print('No') file_results['test_cause_found'] = 'No' file_results.to_csv('test.csv', index=False) if __name__ == '__main__': main()
问题原因分析
- 空DataFrame赋值问题:初始创建的
file_results是空DataFrame,直接对列赋值会导致没有对应的行,最终输出的CSV是空的。 - 列名拼写错误:第二段代码中误写为
test_cause_found,和初始定义的test_case_found不一致。 - 覆盖式赋值:每次循环直接对整个列赋值
'Yes'或'No',会覆盖之前的所有结果,而不是为每个文件添加一行新记录。 - 重复判断逻辑:对每个关键词单独判断,会导致同一个文件被多次标记,不符合“只要存在任意一个关键词就标记Yes”的需求。
- 文件未关闭:直接用
open()打开文件后没有关闭,可能导致资源泄漏。
修正后的代码
import pandas as pd from Byron import copy_to_processor_directory from pip import qualify_file_name, FileCompare, normalize_file_extension from pep.settings import WORKSPACE_ROOT, ACCOUNT_HOME import os words_in_file = ['remote_directory', 'file_path'] def main(): # 先收集所有文件的结果到列表,再转成DataFrame,效率更高 results_list = [] for subdir, dirs, files in os.walk(ACCOUNT_HOME): for file in files: file_path = os.path.join(subdir, file) # 使用with语句自动管理文件,避免资源泄漏 with open(file_path, 'r', encoding='utf-8', errors='ignore') as f: file_content = f.read() # 检查是否有任意一个关键词存在 has_keyword = any(key in file_content for key in words_in_file) result = 'Yes' if has_keyword else 'No' # 添加文件路径和结果到列表 results_list.append({'file_path': file_path, 'test_case_found': result}) # 将列表转成DataFrame file_results = pd.DataFrame(results_list) # 保存到CSV file_results.to_csv('test.csv', index=False) if __name__ == '__main__': main()
代码改进说明
- 结果收集方式:先将每个文件的路径和结果存入列表,最后一次性转为DataFrame,比逐行添加DataFrame更高效。
- 文件管理:使用
with语句读取文件,自动关闭文件,避免资源泄漏。 - 关键词检测优化:用
any()函数判断文件中是否存在任意一个关键词,符合需求且逻辑简洁。 - 添加文件路径:在DataFrame中加入
file_path列,方便对应每个文件的检测结果。 - 编码处理:添加
encoding='utf-8', errors='ignore'避免读取非UTF-8编码文件时出错。
内容的提问来源于stack exchange,提问作者Nia Jackson
相关产品推荐
相关产品推荐

