我有一个包含90K文件的目录.这是一个非常大量的文件,可以像ls失败一样重击功能.当然,os.listdir()从我的python(Mac Python,2.5版)脚本开始; 它失败了OSError: [Errno 12] Cannot allocate memory: '.'
人们会说"不要把那么多文件放在一个目录里!你疯了吗?" - 但我喜欢假装我生活在未来,一个辉煌,发光的地方,我可以随意使用千兆字节的内存,而且不需要太担心我的文件到底在哪里,只要有我的旋转盘片上留下了锈迹.
那么,这个os.listdir()问题有一个很好的解决方法吗?我考虑过只是冒出来find,但这有点严重,不幸的find是递归,Mac OS X 10.6上没有受支持的maxdepth选项.
这是os.listdir通过shell来查找的内容,粗略地说:
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
Run Code Online (Sandbox Code Playgroud)
更新: os.listdir()在Python 2.6中成功.
你在Python中遇到了一个历史工件:os.listdir应该返回一个迭代器,而不是一个数组.我认为这个函数早于迭代器 - 奇怪的是没有os.xlistdir添加.
这比在巨大的目录上使用内存更有效.即使在只有几千个文件的目录上,您也必须等待整个目录扫描完成,并且您必须读取整个目录,即使第一个条目是您正在查找的条目.
这在Python中是一个相当明显的缺点:似乎没有绑定到低级opendir/ readdir/ fdopendirAPI,所以看起来甚至不可能在不编写本机模块的情况下自己实现它.这是那些案件之一,它是这样一个巨大的,因为我怀疑自己和怀疑,我只是没有看到它的标准库大洞-有低层次的open,stat等绑定,这是在同类别.
def ls(directory):
"""full-featured solution, via wrapping find"""
import os
files = os.popen4('find %s' % directory)[1].read().rstrip().split('\n')
files.remove(directory)
n = len(directory)
if directory[-1] != os.path.sep:
n += 1
files = [f[n:] for f in files] # remove dir prefix
return [f for f in files if os.path.sep not in f] # remove files in sub-directories
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2987 次 |
| 最近记录: |