我有一个包含 90K 个文件的目录。文件数量如此之多,以至于像 ls
这样的 bash 函数都失败了。当然,os.listdir()
来 self 的 python(Mac Python,版本 2.5)脚本;它失败并显示 OSError: [Errno 12] Cannot allocate memory: '.'
人们会说“不要把那么多文件放在一个目录中!你疯了吗?” -- 但我喜欢假装我生活在未来,一个灿烂、灿烂的地方,在那里我有千兆字节的内存可供我使用,而且不需要太担心我的文件到底去了哪里,只要有我旋转的盘子上留下了锈迹。
那么,对于这个 os.listdir()
问题是否有好的解决方法?我考虑过只花钱去寻找 find
,但这有点恶心,不幸的是 find
是递归的,在 Mac OS X 10.6 上不支持 maxdepth 选项。
这里是 os.listdir 通过 shell out 查找的大致样子:
def ls(directory):
import os
files = os.popen4('find %s' % directory)[1].read().rstrip().split('\n')
files.remove(directory)
return files # probably want to remove dir prefix from everything in here too
更新 os.listdir()
在 python 2.6 中成功。
最佳答案
您遇到了 Python 中的一个历史遗迹:os.listdir
应该返回一个迭代器,而不是一个数组。我认为这个函数早于迭代器——奇怪的是没有添加 os.xlistdir
。
这不仅仅对大目录的内存使用有影响。即使在只有几千个文件的目录上,您也必须等待整个目录扫描完成,并且必须读取整个目录,即使第一个条目是一个你正在寻找的。p>
这是 Python 中一个非常明显的缺陷:似乎没有绑定(bind)到低级 opendir
/readdir
/fdopendir
API,所以如果不编写 native 模块,似乎甚至不可能自己实现它。这是其中一个案例,标准库中存在如此巨大的漏洞,我怀疑自己并怀疑我只是没有看到它——有低级的 open
, stat
等绑定(bind),和this属于同一类。
关于python - 使用 os.listdir 解决 OSError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098831/