跳到正文
效率工具实用笔记关于本站
文件整理

用 pathlib 按扩展名查找文件:先列清单再决定是否处理

约 7 分钟阅读AI 辅助整理

用 pathlib 的 glob 和 suffix 在自建练习目录中按扩展名筛出文件,先输出清单核对,不直接删除原文件。适合初学者在动手整理前先看清有哪些文件。

本文要点

  1. 下面这段代码只在你指定的练习目录里创建示例文件,不修改系统其他位置

  2. glob 接受一个模式,例如 *.txt 表示当前目录下以 .txt 结尾的条目

  3. 找到文件之后,不要立刻删除或移动

用 pathlib 按扩展名查找文件:先列清单再决定是否处理的知识要点示意图
依据已审核正文摘取要点制作的示意图,非实物照片;请结合正文中的条件与范围阅读。要点摘自已审核正文;完整条件与说明见正文。查看高清图解 ↗
本文目录

先回答:按扩展名找文件,用 glob 加后缀判断

如果你想把一个目录里所有某种类型的文件找出来,又不想动原文件,可以分两步:先用 Path.glob 按模式匹配,再用 suffix 确认扩展名。

pathlib 是 Python 标准库中表示文件系统路径的模块,从 Python 3.4 开始提供。Path 是最常用的具体路径类,会根据当前系统生成对应的路径类型。glob 方法在某个目录下按给定模式匹配,返回匹配到的路径对象;suffix 属性给出最后一个点之后的部分,也就是常说的文件扩展名。

本文只做一件事:在自建练习目录里按扩展名列出文件,输出清单供你核对。不执行删除、移动或重命名,也不涉及递归遍历之外的高级参数。

开始前请先复制一份目录作为练习副本,不要拿重要数据直接做实验。

自建练习目录:先造几个不同后缀的文件

下面这段代码只在你指定的练习目录里创建示例文件,不修改系统其他位置。路径变量请替换成你自己的练习相对路径,例如 exercise/。

from pathlib import Path

base = Path("exercise/demo_scan")
base.mkdir(parents=True, exist_ok=True)

(base / "notes.txt").write_text("示例文本")
(base / "readme.md").write_text("示例说明")
(base / "photo.jpg").write_bytes(b"example")
(base / "data.csv").write_text("name,age\nAlice,30\n")

运行后,exercise/demo_scan 目录里会有四个文件,后缀分别是 .txt、.md、.jpg、.csv。这些内容都是练习用的自建数据,不对应任何真实文件。

用 glob 匹配后缀,再用 suffix 复核

glob 接受一个模式,例如 *.txt 表示当前目录下以 .txt 结尾的条目。它返回的是路径对象,顺序不固定,需要固定顺序时自己排序。

from pathlib import Path

base = Path("exercise/demo_scan")

for p in sorted(base.glob("*.txt")):
    print(p.name, p.suffix)

输出类似:

notes.txt .txt

这里有两个动作要分开看。第一,glob("*.txt") 负责按模式筛选;第二,p.suffix 负责复核这个路径对象的扩展名到底是什么。两者结果一致时,你才确认这是要处理的文件。

如果只想按扩展名判断、不依赖模式,也可以先列出目录内容再逐个检查:

from pathlib import Path

base = Path("exercise/demo_scan")

for p in sorted(base.iterdir()):
    if p.is_file() and p.suffix == ".csv":
        print(p.name)

iterdir 会产出目录内容,但不包含 . 和 .. 这两个特殊条目。is_file 用来排除子目录,避免把目录名也当成文件。

先输出清单核对,再决定下一步

找到文件之后,不要立刻删除或移动。先把结果打印成一份清单,逐项核对文件名和后缀是否符合预期。

from pathlib import Path

base = Path("exercise/demo_scan")

matches = sorted(p for p in base.glob("*.jpg") if p.is_file())

print("匹配数量:", len(matches))
for p in matches:
    print(p.name)

输出类似:

匹配数量: 1
photo.jpg

核对时看三件事:数量对不对、文件名是不是你要找的那几个、有没有把不该处理的文件也带进来。清单确认无误后,再考虑后续操作。本文不给出删除或移动的代码,因为题目要求避免直接删除原文件。

如果确实需要处理,建议先把匹配到的文件复制到另一个练习目录,在副本上操作,保留原文件不动。

匹配结果不对时,先查这三处

第一,模式写错。glob("*.txt") 只匹配当前目录下的条目,不会进入子目录;要包含子目录,需要用递归模式,但那会扩大匹配范围,核对时要更谨慎。

第二,后缀判断被多点文件名影响。suffix 只取最后一个点之后的部分。例如 library.tar.gz 的 suffix 是 .gz,不是 .tar.gz。如果你要按 .tar.gz 这类组合后缀筛选,suffix 单独用不够,需要另想办法,本文不展开。

第三,目录里根本没有匹配项。glob 匹配不到时返回空结果,不会报错。这时先确认路径指向的目录是否存在、文件名拼写是否和你以为的一致。

另外,glob 在扫描文件系统时可能遇到权限问题。资料说明,从 3.13 起,扫描文件系统时抛出的 OSError 会被抑制,其中包括访问无读取权限目录时的 PermissionError;在更早的版本里,这类异常在很多情况下被抑制,但不是全部。核对数量时如果和预期差很多,可以检查一下目录权限。

适用范围与限制

本文只覆盖按扩展名查找文件这一基础操作,用到的只有 Path、glob、iterdir、suffix、is_file 这几个基础接口。不涉及递归遍历的高级参数、符号链接处理、URI 转换或路径解析。

平台方面,Path 会根据当前系统生成对应的路径类型,Windows 和 POSIX 系统上的路径分隔符不同,但 glob 和 suffix 的用法一致。glob 的 case_sensitive 参数默认按平台规则匹配:通常 POSIX 系统区分大小写,Windows 不区分;需要覆盖这一行为时,可以显式设置该参数。

本文所有代码只针对自建练习目录,不执行删除、移动或系统修改。如果你要在真实目录上操作,先备份,再在副本上练习。

观看知识要点视频 18 秒

18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。

参考资料

以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。

请结合原始资料的适用条件阅读。

返回文件整理 →