迭代Python中目录中的无限文件

时间:2014-04-02 23:46:32

标签: python file out-of-memory generator os.walk

我正在使用Python 3.3。

如果我正在操作目录中的潜在无限文件(请耐心等待;只是假装我有一个支持它的文件系统),如何在不遇到MemoryError的情况下执行此操作?我只想让一个文件的字符串名一次在内存中。我不希望它们都在迭代中,因为当存在太多时会导致内存错误。

os.walk()工作得很好,因为它返回一个生成器?或者,发电机不能那样工作吗?

这可能吗?

1 个答案:

答案 0 :(得分:1)

编辑:如果你有一个系统来命名可以计算出来的文件,你可以这样做(这会迭代任意数量的编号txt文件,一次只有一个内存;你可以转换到另一个可计算的系统,以获得较大数字的较短文件名):

import os

def infinite_files(path):
    num=0;
    while 1:
        if not os.path.exists(os.path.join(path, str(num)+".txt")):
            break
        else:
            num+=1 #perform operations on the file: str(num)+".txt"

[编辑:我以前不适用的答案如下:]

glob.iglob似乎完全符合问题的要求。 [编辑:它没有。它实际上似乎效率低于listdir(),但请参阅上面的替代解决方案。]引用Python文档:"返回一个迭代器,它产生与glob()相同的值而不实际同时存储它们"由于它使用了世界yield,因此可以说它们在这里使用了一个生成器,spinlok说明这就是生成器的用途是正确的。这是我引用的Python文档URL:

https://docs.python.org/3.4/library/glob.html

请注意,glob.iglob的工作方式与glob.glob类似。因此,您可以在路径中使用通配符进行搜索:例如

import glob
for x glob.iglob("/home/me/Desktop/*.txt"):
    print(x) #prints all txt files in that directory

我没有看到一种方法来区分文件和目录,而无需手动操作。但是,这当然是可能的。