You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3下无需创建列表遍历Linux目录的最优方法

在Python 3中低内存占用遍历目录的最优方案

嘿,这个需求太贴合实际了——内存吃紧的时候,一次性把所有目录条目塞进列表里确实是个没必要的负担!在Python 3里,**os.scandir()**就是专门解决这个场景的最优方案,完全符合你“直接通过目录句柄遍历、不一次性加载所有内容”的要求。

为什么os.scandir()是最佳选择?

它返回的是一个迭代器,而非列表。这意味着它不会一次性把目录里所有条目都读取到内存中,而是在你遍历的过程中,才逐个从系统中获取条目信息。此外它还有个额外优势:返回的DirEntry对象自带文件基础属性(比如是否为目录、文件大小等),不用再额外调用os.stat(),性能比传统的os.listdir()更出色。

基础用法示例

import os

# 用with语句自动管理目录句柄,避免资源泄漏
with os.scandir('/你要遍历的目录路径') as entries:
    for entry in entries:
        # 打印条目名称
        print(f"条目名:{entry.name}")
        # 直接判断是否为目录(可选跳过符号链接)
        if entry.is_dir(follow_symlinks=False):
            print(f"→ {entry.name} 是一个目录")
        # 直接判断是否为文件
        elif entry.is_file(follow_symlinks=False):
            print(f"→ {entry.name} 是一个文件")

更简洁的面向对象写法:pathlib.Path.iterdir()

如果你偏好Python的面向对象风格,Python 3.4+引入的pathlib模块里的Path.iterdir()也是个好选择,同样返回迭代器,内存友好:

from pathlib import Path

target_dir = Path('/你要遍历的目录路径')
# iterdir()返回迭代器,逐个生成Path对象
for item in target_dir.iterdir():
    print(f"条目:{item.name}")
    if item.is_dir():
        print(f"→ 这是目录:{item}")

递归遍历的补充

如果需要递归遍历子目录,os.scandir()可以配合递归函数实现;而pathlib里的Path.rglob('*')也能递归遍历所有条目,同样是迭代器模式,不会一次性加载所有内容。

总结一下:这两个方法都是内存友好的遍历方式,os.scandir()性能略优,pathlib写法更优雅,根据你的习惯选就行~

内容的提问来源于stack exchange,提问作者Kid Gradius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:06:18