我正在使用Python 3.3。
如果我正在操作目录中潜在的无限文件(请耐心等待;假设我有一个支持它的文件系统),如何在不遇到 MemoryError 的情况下做到这一点?我只希望一次一个文件的字符串名称在内存中。我不希望它们都在可迭代对象中,因为当太多时会导致内存错误。
os.walk() 会正常工作吗,因为它返回了一个生成器?或者,发电机不是那样工作的吗?
这可能吗?
如果你有一个可以用计算来命名文件的系统,你可以这样做(这会迭代任意数量的编号 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()
效率低,但请参阅上面的替代解决方案。来自官方文档:
glob.glob(pathname, *, recursive=False)
返回与路径名匹配的路径名的可能为空的列表,该列表必须是包含路径规范的字符串。路径名可以是绝对的(如/usr/src/Python-1.5/Makefile
)或相对的(如../../Tools/*/*.gif
),并且可以包含 shell 样式的通配符。损坏的符号链接包含在结果中(如在外壳中)。
glob.iglob(pathname, *, recursive=False)
返回一个迭代器,该迭代器生成与glob()
相同的值,而实际上没有同时存储它们。
iglob
返回一个"产生迭代器",或者更简洁地说,返回一个生成器。
由于glob.iglob
与 glob.glob
具有相同的行为,因此您可以使用通配符进行搜索:
import glob
for x glob.iglob("/home/me/Desktop/*.txt"):
print(x) #prints all txt files in that directory
我看不到在不手动操作的情况下区分文件和目录的方法。然而,这当然是可能的。