📜  门|门 IT 2006 |第 74 题(1)

📅  最后修改于: 2023-12-03 15:42:21.755000             🧑  作者: Mango

门|门 IT 2006 |第 74 题

题目描述

设计一个类,使得该类的实例可以遍历一个给定的目录下所有的文件和目录。实现该类的 __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)
注意事项
  • 本类的实例是不可重用的。如果需要重新遍历同一个目录,需要重新创建一个实例。

  • 如果目录结构非常复杂或者目录下的文件数量非常多,可能会导致内存占用较大,甚至会导致内存溢出。建议在使用时增加异常处理,避免不必要的错误。