当目录很大时,用Python列出目录中的文件

当目录很大时,用Python列出目录中的文件,python,file,sorting,directory,size,Python,File,Sorting,Directory,Size,我试图用Python处理许多文件。我首先需要得到一个目录中所有文件的列表。目前,我正在使用: os.listdir(dir) 不过。这是不可行的,因为我正在搜索的目录中有超过81000个文件,总计接近5GB 逐个浏览每个文件的最佳方式是什么?如果Windows不确定Python进程没有响应并终止它?因为这很容易发生 它是在32位WindowsXP机器上运行的,所以很明显它不能索引超过4GB的RAM 任何人有没有其他办法来解决这个问题?您可以使用它来避免将整个文件名列表读入内存。这将返回一个生成

我试图用Python处理许多文件。我首先需要得到一个目录中所有文件的列表。目前,我正在使用:

os.listdir(dir)
不过。这是不可行的,因为我正在搜索的目录中有超过81000个文件,总计接近5GB

逐个浏览每个文件的最佳方式是什么?如果Windows不确定Python进程没有响应并终止它?因为这很容易发生

它是在32位WindowsXP机器上运行的,所以很明显它不能索引超过4GB的RAM

任何人有没有其他办法来解决这个问题?

您可以使用它来避免将整个文件名列表读入内存。这将返回一个生成器对象,允许您逐个遍历目录中的文件名:

import glob

files = glob.iglob(pathname\*)

for f in files:
    # do something with f

您可能想尝试使用该模块:

scandir
是一个模块,它提供了
os.listdir()的生成器版本
这也会暴露操作系统中的额外文件信息
迭代目录时返回
scandir
还提供了一个 更快版本的
os.walk()
,因为它可以使用额外的文件 通过
scandir()
函数公开的信息

有人提议将其合并到Python标准库中,因此它似乎有一些吸引力

他们文档中的简单用法示例:

def subdirs(path):
    """Yield directory names not starting with '.' under given path."""
    for entry in os.scandir(path):
        if not entry.name.startswith('.') and entry.is_dir():
            yield entry.name