迭代Python目录中的无限文件

问题描述 投票:2回答:1

我正在使用Python 3.3。

[如果我要处理目录中潜在的无限文件(忍受我;只假装我有一个支持该文件的文件系统),如何在不遇到MemoryError的情况下做到这一点?我只希望一次将一个文件的字符串名称存储在内存中。我不希望它们全部都是可迭代的,因为太多时会导致内存错误。

os.walk()是否会正常工作,因为它会返回生成器?还是发电机不能那样工作?

这可能吗?

python file out-of-memory generator os.walk
1个回答
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(),但请参见上面的替代解决方案。]从official documentation

glob.glob(路径名,*,递归= False)返回与路径名匹配的路径名的可能为空的列表,该列表必须是包含路径说明的字符串。路径名可以是绝对的(例如/usr/src/Python-1.5/Makefile)或相对的(例如../../Tools/*/*.gif),并且可以包含shell样式的通配符。损坏的符号链接包含在结果中(如在外壳程序中一样。)>

glob.iglob(pathname,*,recursive = False)

返回一个迭代器,该迭代器产生的值与glob()相同,而没有同时实际存储它们。

iglob返回一个“产生迭代器”,或者更简洁地说,是一个生成器。

由于glob.iglobglob.glob具有相同的行为,因此可以使用通配符搜索:

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

我看不到一种无需手动执行即可区分文件和目录的方法。当然,这是可能的。


-1
投票
i = 1
while(i>0):
   i = i + 1
   file = open(f"file{i}.txt")
   file.write("helo world")
   file.close()

运行该程序时,您的python应用程序所在的目录中有许多文件!

© www.soinside.com 2019 - 2024. All rights reserved.