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

遍历目录文件并根据关键词写入新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()
问题原因分析
  1. 空DataFrame赋值问题:初始创建的file_results是空DataFrame,直接对列赋值会导致没有对应的行,最终输出的CSV是空的。
  2. 列名拼写错误:第二段代码中误写为test_cause_found,和初始定义的test_case_found不一致。
  3. 覆盖式赋值:每次循环直接对整个列赋值'Yes'或'No',会覆盖之前的所有结果,而不是为每个文件添加一行新记录。
  4. 重复判断逻辑:对每个关键词单独判断,会导致同一个文件被多次标记,不符合“只要存在任意一个关键词就标记Yes”的需求。
  5. 文件未关闭:直接用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:50:24