python - 使用 os.listdir 解决 OSError

标签 python macos

我有一个包含 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

这不仅仅对大目录的内存使用有影响。即使在只有几千个文件的目录上,您也必须等待整个目录扫描完成,并且必须读取整个目录,即使第一个条目是一个你正在寻找的。

这是 Python 中一个非常明显的缺陷:似乎没有绑定(bind)到低级 opendir/readdir/fdopendir API,所以如果不编写 native 模块,似乎甚至不可能自己实现它。这是其中一个案例,标准库中存在如此巨大的漏洞,我怀疑自己并怀疑我只是没有看到它——有低级的 open stat等绑定(bind),和this属于同一类。

关于python - 使用 os.listdir 解决 OSError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098831/

相关文章:

python - 从 Python 中的字符串中提取字段和值

macos - Mac 应用程序包 ID 未更改

macos - 使用 Matlab 和其他程序在 Mac 上导出 PNG 时出现白线

python - 在 Python 中,如何自然地对字母数字字符串列表进行排序,使字母字符排在数字字符之前?

python 在每个索引处对数组中的所有先前值求和

python - 从python中的列表中删除多个重复值

当我在执行中使用 %s 时出现 python- mysql 错误

objective-c - 返回 NSString 时出现 SIGTERM

c - JNI 库中 OS/X 上的指针截断为 'realloc()'

ruby - 如何将 TextMate 中的一行发送到在终端窗口中运行的 irb 进程?