在目录非常大的情况下使用Python列出文件

2 投票
2 回答
2856 浏览
提问于 2025-04-18 18:50

我正在用Python处理很多文件。首先,我需要获取一个目录下所有文件的列表。目前,我使用的是:

os.listdir(dir)

但是,这样做不太可行,因为我搜索的目录里有超过81,000个文件,总大小接近5GB。

有没有什么好的方法可以一个一个地处理这些文件?而不是让Windows认为Python程序没有响应然后把它杀掉?因为这种情况经常发生。

我是在一台32位的Windows XP机器上运行这个程序,所以显然它不能使用超过4GB的内存。

有没有其他人有什么想法来解决这个问题?

2 个回答

1

你可以使用 glob.iglob 这样的方法,这样就不需要把所有文件名一次性读到内存里。这个方法会返回一个生成器对象,让你可以一个一个地查看目录里的文件名:

import glob

files = glob.iglob(pathname\*)

for f in files:
    # do something with f
3

你可以试试使用scandir这个模块:

scandir是一个模块,它提供了一种生成器版本的os.listdir(),这个版本可以在你遍历一个文件夹时,显示操作系统返回的额外文件信息。scandir还提供了一个比os.walk()快得多的版本,因为它可以利用scandir()函数提供的额外文件信息。

有一个被接受的PEP提议将它合并到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

撰写回答