非常游戏网
如何使用Python获取文件夹下的文件数量_通过len与os.listdir

如何使用Python获取文件夹下的文件数量_通过len与os.listdir

2026-05-29日常编程45505

os.listdir()返回指定路径下一级子项(文件和文件夹)的名称列表,故len()统计的是条目总数而非纯文件数;需配合os.path.isfile(os.path.join(path, f))过滤才能准确计数。

os.listdir() 返回的是什么,为什么不能直接用 len() 统计子目录里的文件数

os.listdir() 只返回指定路径下**一级子项的名称列表**(包括文件和文件夹),不递归、不区分类型、也不过滤隐藏项。所以 len(os.listdir(path)) 得到的是该目录下所有条目总数,不是“文件数量”。如果你误以为它只返回文件,就容易把文件夹也当文件算进去。

常见错误现象:len(os.listdir("my_folder")) 返回 5,但实际只有 3 个文件 + 2 个子文件夹 —— 这时候你得到的是 5,不是 3。

  • 使用场景:仅需统计当前目录下**可见条目总数**(含文件+文件夹)时,len(os.listdir(path)) 是快且够用的
  • 若要纯文件数,必须配合 os.path.isfile() 过滤
  • 注意:Windows 下默认不显示隐藏文件,但 Linux/macOS 下 .git.DS_Store 等会被计入 —— os.listdir() 不自动跳过它们

如何准确统计当前目录下的普通文件数量(不含子目录)

需要遍历 os.listdir() 的结果,并用 os.path.isfile() 判断每个条目是否为文件。路径拼接必须用 os.path.join(),不能字符串拼接,否则在 Windows 下容易出错(比如反斜杠被当成转义符)。

Python 3.14.3

微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。

import os

path = "/your/target/dir"
files_only = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
file_count = len(files_only)
  • os.path.isfile(os.path.join(path, f)) 是关键判断,缺了这步就会混入文件夹
  • 不要写成 os.path.isfile(f) —— 这会因相对路径失效,尤其在非当前工作目录下调用时必错
  • 如果想排除隐藏文件(以 . 开头),加个条件:not f.startswith(".")

为什么不用 glob 或 pathlib?对比 os.listdir 的实际差异

os.listdir() + len() 是最轻量的方式,没有额外依赖、启动快、内存占用低 —— 特别适合脚本中快速探查一个目录的粗略结构。但它的短板也很明确:不支持通配符过滤(比如只算 .py 文件),也不自带递归能力。

  • glob.glob("*.py") 更适合按扩展名筛选,但默认不包含子目录,且返回的是完整路径,len() 可直接用
  • pathlib.Path(path).iterdir() 更现代,可链式调用(如 .is_file()),但对象创建有微小开销;对简单计数来说,优势不明显
  • 性能影响:10 万级条目下,os.listdir()pathlib 快约 10%~15%,但日常使用几乎无感

遇到 PermissionError 或 UnicodeDecodeError 怎么办

os.listdir() 在遇到权限不足的子项(如系统保护目录)或路径含非法字节(某些挂载卷或损坏文件名)时,会直接抛出异常,导致整个 len() 表达式中断 —— 它不像 os.walk() 那样能跳过错误继续执行。

  • 必须用 try/except 包裹,例如:try: entries = os.listdir(path) except (PermissionError, OSError): entries = []
  • 不要试图用 sys.getfilesystemencoding() 去解码文件名 —— Python 3 中 os.listdir() 返回的是 str,编码问题通常已在系统层处理
  • 如果只是统计,且允许忽略异常项,清空 entries 后再 len() 即可,不必中止程序

实际用的时候,最常被忽略的是路径拼接那一步 —— 少了 os.path.join(),在子目录里一跑就全错。