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

如何修改Python代码跳过隐藏文件夹以修复失败的测试?

问题解决:递归获取文件时跳过隐藏文件夹

原代码的测试用例执行失败,核心原因是判断逻辑仅检查完整路径开头是否为.,但像tmp/.tmp/tmp这类包含隐藏目录的路径,开头是普通目录名,导致隐藏文件夹内的文件被错误收集。

修改方案

提供两种可行的修改方式,按需选择:

方式1:遍历过程中直接跳过隐藏目录(性能更优)

利用os.walk默认的topdown=True特性,在遍历每一层时过滤掉隐藏目录,让os.walk不再进入这些目录递归遍历:

import os
from typing import List
import logging
from pathlib import Path
import shutil

logger = logging.getLogger(__name__)

def get_files_not_in_hidden_folder(parent_folder: str, extension: str) -> List[str]:
    """
    递归获取指定目录下指定扩展名的文件,跳过所有隐藏文件夹中的文件
    """
    files = []
    for root, dirs, filenames in os.walk(parent_folder):
        # 过滤当前层级的隐藏文件夹,os.walk将不再进入这些目录
        dirs[:] = [d for d in dirs if not d.startswith('.')]
        for filename in filenames:
            if filename.endswith(extension):
                files.append(os.path.join(root, filename))
    logger.debug(f"get_files_not_in_hidden_folder: {parent_folder}, {extension} -> {files}")
    return files

def test_get_files_not_in_hidden_folder():
    Path('tmp').mkdir(parents=True, exist_ok=True)
    Path('tmp/test.json').touch()
    Path('tmp/tmp/.tmp').mkdir(parents=True, exist_ok=True)
    Path('tmp/tmp/.tmp/test.json').touch()
    Path('tmp/.tmp/tmp').mkdir(parents=True, exist_ok=True)
    Path('tmp/.tmp/tmp/test.json').touch()

    assert get_files_not_in_hidden_folder('tmp', '.json') == ['tmp/test.json']

    shutil.rmtree(Path('tmp'))

方式2:检查路径是否包含隐藏目录(逻辑更直观)

拆分当前路径的所有层级,只要其中存在以.开头的目录,就跳过该目录下的所有文件:

import os
from typing import List
import logging
from pathlib import Path
import shutil

logger = logging.getLogger(__name__)

def get_files_not_in_hidden_folder(parent_folder: str, extension: str) -> List[str]:
    """
    递归获取指定目录下指定扩展名的文件,跳过所有隐藏文件夹中的文件
    """
    files = []
    for root, _, filenames in os.walk(parent_folder):
        # 拆分路径为各个层级,检查是否存在隐藏目录
        path_parts = os.path.normpath(root).split(os.sep)
        if any(part.startswith('.') for part in path_parts):
            continue
        for filename in filenames:
            if filename.endswith(extension):
                files.append(os.path.join(root, filename))
    logger.debug(f"get_files_not_in_hidden_folder: {parent_folder}, {extension} -> {files}")
    return files

def test_get_files_not_in_hidden_folder():
    Path('tmp').mkdir(parents=True, exist_ok=True)
    Path('tmp/test.json').touch()
    Path('tmp/tmp/.tmp').mkdir(parents=True, exist_ok=True)
    Path('tmp/tmp/.tmp/test.json').touch()
    Path('tmp/.tmp/tmp').mkdir(parents=True, exist_ok=True)
    Path('tmp/.tmp/tmp/test.json').touch()

    assert get_files_not_in_hidden_folder('tmp', '.json') == ['tmp/test.json']

    shutil.rmtree(Path('tmp'))

说明

  • 方式1通过提前过滤隐藏目录,避免了无效的递归遍历,性能更好。
  • 方式2通过检查路径全层级,确保只要路径中存在隐藏目录就跳过文件收集,逻辑更清晰,适用于需要遍历隐藏目录但不收集其中文件的场景。

两种修改均能让原测试用例通过,正确返回['tmp/test.json']。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:25:20