我正在使用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()
,但请参见上面的替代解决方案。]从official documentation:
glob.glob(路径名,*,递归= 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
我看不到一种无需手动执行即可区分文件和目录的方法。当然,这是可能的。
i = 1
while(i>0):
i = i + 1
file = open(f"file{i}.txt")
file.write("helo world")
file.close()
运行该程序时,您的python应用程序所在的目录中有许多文件!