Python 3.14 fnmatch.filterfalse怎样筛掉匹配文件
如果手里已经有一组文件名,只想把匹配 *.pyc 或 *.tmp 的项目排除掉,Python 3.14 可以直接使用 fnmatch.filterfalse(names, pattern)。它接收字符串列表和一个 shell 风格通配符,返回“不匹配”该模式的字符串列表;想保留匹配项时,仍然使用 fnmatch.filter()。
官方地址:https://docs.python.org/3.14/library/fnmatch.html
这个 API 只负责匹配字符串,不会删除文件,也不会递归扫描目录。下面从最小写法开始,把返回方向、多个模式、大小写和旧版本兼容边界一次说明白。
分清 filter 与 filterfalse 的保留方向
两者的输入形式相同,区别只在于返回哪一侧:
fnmatch.filter(names, pattern):保留匹配模式的名称。fnmatch.filterfalse(names, pattern):排除匹配模式的名称,保留其余名称。
可以把它们理解为同一组匹配关系的两种取集合方式。不要因为函数名里有 false 就把它当成返回布尔值;它返回的仍然是一个列表。

用单个通配符排除文件名
下面的例子把缓存字节码文件从待处理清单中去掉。注释说明了输入、匹配方向和结果的用途:
from fnmatch import filterfalse # 这是已经得到的文件名清单;filterfalse 只处理字符串,不操作磁盘。 names = ["main.py", "cache.pyc", "README.md", "worker.py"] # 排除所有以 .pyc 结尾的名称,返回其余名称。 source_files = filterfalse(names, "*.pyc") print(source_files)
调用的第二个参数是 shell 风格模式,而不是完整正则表达式。常见规则包括:
| 模式 | 含义 | 例子 |
|---|---|---|
* | 匹配任意长度的字符 | *.tmp |
? | 匹配一个字符 | part?.csv |
[seq] | 匹配序列中的一个字符 | report[0-9].txt |
[!seq] | 匹配不在序列中的一个字符 | part[!0].csv |
返回值可以继续传给后续函数,也可以显式转成列表保存。它不会根据后缀删除真实文件,因此把结果交给 os.remove() 之前仍需由业务代码决定是否允许删除。
处理多个模式与路径大小写
filterfalse() 一次接收一个模式。需要同时排除多个后缀时,推荐先明确“任一模式命中就排除”的集合语义,再保留未命中的名称:
from fnmatch import fnmatch, filterfalse
# 这些名称来自上一步或目录遍历结果;本例只演示字符串过滤。
names = ["app.py", "app.pyc", "debug.tmp", "notes.txt", "BUILD.TMP"]
excluded_patterns = ("*.pyc", "*.tmp")
# 任一模式匹配就进入排除集合;fnmatch 使用 shell 风格通配符。
excluded = [
name for name in names
if any(fnmatch(name, pattern) for pattern in excluded_patterns)
]
# 用排除集合构造保留集合,避免把“多个模式”误写成一次 filterfalse 调用。
kept = [name for name in names if name not in excluded]
print(kept)
如果模式数量很少,这种写法最容易读懂;如果需要保持原始顺序,列表推导会自然保留 names 的顺序。不要把多个模式拼成一个正则表达式再传给 filterfalse(),因为 fnmatch 的语法与正则表达式不是一套规则。

大小写行为还要看平台的规范化规则。官方文档说明,fnmatch() 会使用 os.path.normcase() 做大小写规范化,而 fnmatchcase() 强制区分大小写。若业务要求跨平台结果稳定,可以显式选择 fnmatchcase(),不要把开发机上的大小写表现当成所有系统都一样。
兼容没有 filterfalse 的 Python 版本
filterfalse() 是 Python 3.14 在 fnmatch 模块中新增的反向过滤入口。如果项目仍需要运行在更早版本,可以用 fnmatch() 组合补集:
from fnmatch import fnmatch
def exclude_matches(names, pattern):
# 兼容旧版本:只保留“不匹配”模式的名称,语义等价于 filterfalse。
return [name for name in names if not fnmatch(name, pattern)]
names = ["main.py", "cache.pyc", "README.md"]
clean_names = exclude_matches(names, "*.pyc")
print(clean_names)
如果只支持 Python 3.14 及以上版本,直接导入 filterfalse 更能表达意图;如果是公共库或插件,兼容函数可以集中放在适配层,避免项目各处重复写列表推导。
什么时候不要用 filterfalse
这个函数适合“已有字符串集合 + 一个 shell 风格模式”的过滤任务,下面几种情况应换工具:
- 需要递归查找目录、处理权限或跳过符号链接时,用
pathlib.Path.rglob()等目录 API,再把名称过滤作为单独一步。 - 需要复杂捕获组、量词或边界断言时,用
re;不要把正则表达式直接传给fnmatch。 - 需要删除、移动或改名时,把过滤结果交给明确的文件操作函数,并在业务层处理异常和回滚。
- 需要保留匹配项时用
filter(),不要先调用filterfalse()再手动求补集。
速查表:按目标选调用方式
| 目标 | 推荐写法 | 关键边界 |
|---|---|---|
| 保留匹配项 | fnmatch.filter(names, pattern) | 一次处理一个模式 |
| 排除匹配项 | fnmatch.filterfalse(names, pattern) | Python 3.14 新入口 |
| 旧版本排除匹配项 | [n for n in names if not fnmatch(n, pattern)] | 可封装成兼容函数 |
| 强制区分大小写 | fnmatchcase(name, pattern) | 不依赖平台规范化表现 |
| 复杂文本规则 | re | 正则语法不能直接当 fnmatch 模式 |
记住一个判断就够了:filter() 是“留下命中的”,filterfalse() 是“留下没命中的”。多模式场景先写清楚“任一模式命中是否排除”,再决定是用列表推导组合 fnmatch(),还是把任务拆成多个清晰的过滤阶段。
相关问题
- filterfalse 会删除硬盘上的文件吗?不会,它只返回新的字符串列表。
- 能否一次把多个模式传给 filterfalse?不能。需要多个模式时,先用
fnmatch()组合条件,或分阶段过滤。 - 为什么同一个模式在不同系统上大小写结果不同?普通
fnmatch()会结合平台的normcase()规则;严格区分大小写时使用fnmatchcase()。
Python 3.14延迟求值注解解决循环引用
- 上一篇
- Python 3.14延迟求值注解解决循环引用
- 下一篇
- Python warnings.deprecated怎样标记即将移除的API
-
- 文章 · python教程 | 33分钟前 | python · pathlib · Python 硬链接 pathlib Path.hardlink_to
- Python pathlib.Path.hardlink_to 创建硬链接的跨设备报错处理
- 486浏览 收藏
-
- 文章 · python教程 | 36分钟前 | 线程池 · Python gil threadpoolexecutor Python 3.14 free-threading CPU并发
- Python免费线程模式评估CPU并发
- 200浏览 收藏
-
- 文章 · python教程 | 36分钟前 | 兼容性 · Python API迁移 DeprecationWarning Python 3.14 warnings.deprecated 类型检查器
- Python warnings.deprecated怎样标记即将移除的API
- 334浏览 收藏
-
- 文章 · python教程 | 44分钟前 | 兼容性 · Python 类型注解 循环引用 延迟求值 Python 3.14 annotationlib ForwardRef
- Python 3.14延迟求值注解解决循环引用
- 282浏览 收藏
-
- 文章 · python教程 | 49分钟前 | python · Python Template 模板字符串 Python 3.14
- Python 3.14模板字符串处理动态文本
- 344浏览 收藏
-
- 文章 · python教程 | 16小时前 | 数据结构 · 性能边界 · Python key bisect 有序列表 bisect_left insort_left
- Python bisect.insort_left 怎样把元素插入有序列表
- 400浏览 收藏
-
- 文章 · python教程 | 16小时前 | 标准库 · 异常处理 · Python教程 · 错误排查 · Python 异常链 traceback ExceptionGroup TracebackException __cause__ __context__ 日志排障
- Python traceback.TracebackException 怎样保留异常链上下文
- 488浏览 收藏
-
- 文章 · python教程 | 16小时前 |
- Python queue.SimpleQueue 怎样在生产者消费者间传递任务
- 448浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 1039次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 1038次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1181次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1142次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 987次使用
-
- Python TaskGroup 怎样让子任务失败统一收敛
- 2026-11-12 501浏览
-
- Python xml.dom.minidom.unlink 怎样释放不再使用的 DOM 树引用
- 2026-10-27 501浏览
-
- Python typing 怎样用 TypeIs 缩小类型
- 2026-10-24 501浏览
-
- Python sqlite3 Connection serialize 怎么导出数据库快照:备份窗口、内存占用与恢复校验
- 2026-08-26 501浏览
-
- Python监控网页状态:requests异常处理实战
- 2026-05-29 501浏览

