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