我正在使用Python 3.3。
如果我正在操作目录中的潜在无限文件(请耐心等待;只是假装我有一个支持它的文件系统),如何在不遇到MemoryError的情况下执行此操作?我只想让一个文件的字符串名一次在内存中。我不希望它们都在迭代中,因为当存在太多时会导致内存错误。
os.walk()工作得很好,因为它返回一个生成器?或者,发电机不能那样工作吗?
这可能吗?
答案 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
我没有看到一种方法来区分文件和目录,而无需手动操作。但是,这当然是可能的。