Python 3.14 fnmatch.filterfalse怎样筛掉匹配文件
来源:17golang原创
时间:2026-11-15 15:58:49 133浏览 收藏
如果手里已经有一组文件名,只想把匹配 *.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()。
-
346 收藏
-
486 收藏
-
200 收藏
-
334 收藏
-
282 收藏
-
344 收藏
-
366 收藏
-
400 收藏
-
317 收藏
-
427 收藏
-
文章 · python教程 | 16小时前 | 标准库 · 异常处理 · Python教程 · 错误排查 · Python 异常链 traceback ExceptionGroup TracebackException __cause__ __context__ 日志排障488 收藏
-
448 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习