如何修改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
相关产品推荐
相关产品推荐

