📅  最后修改于: 2023-12-03 15:42:21.755000             🧑  作者: Mango
设计一个类,使得该类的实例可以遍历一个给定的目录下所有的文件和目录。实现该类的 __iter__
方法和 __next__
方法,其中:
__iter__
方法返回该实例本身;__next__
方法返回下一个文件名或目录名,如果已经遍历完毕则抛出 StopIteration
异常。首先需要用 os 模块遍历目录结构,可以使用 os.listdir()
函数返回目录下所有的文件和目录名,然后使用 os.path.join()
函数拼接路径,再使用 os.path.isdir()
函数判断是否是目录,如果是目录,则递归调用 __next__
方法进行遍历,将返回的值加上当前目录名称作为前缀,并且作为下一个值返回。如果不是目录,则只返回文件名。
import os
class DirIter:
def __init__(self, path):
self.path = path
self.files = []
self.index = 0
def __iter__(self):
return self
def __next__(self):
if not self.files:
self.files = os.listdir(self.path)
self.index = 0
if self.index == len(self.files):
raise StopIteration
filename = self.files[self.index]
self.index += 1
if os.path.isdir(os.path.join(self.path, filename)):
prefix = os.path.join(self.path, filename) + '/'
filename = next(DirIter(prefix))
return os.path.join(self.path, filename)
dir_iter = DirIter('/path/to/dir')
for file_or_dir in dir_iter:
print(file_or_dir)
本类的实例是不可重用的。如果需要重新遍历同一个目录,需要重新创建一个实例。
如果目录结构非常复杂或者目录下的文件数量非常多,可能会导致内存占用较大,甚至会导致内存溢出。建议在使用时增加异常处理,避免不必要的错误。