如何在使用 os.walk() 时仅扫描某些目录或排除目录

How to scan only some directories or exclude directories while using os.walk()

我需要在使用 os.walk() 时排除一些目录或只扫描其中的一些目录。我正在尝试获取最新的文件。我从 this post but it only return back one file. For my project I would need a list of 5 or more recent files. From this post 那里学会了如何做到这一点,它显示了如何只扫描几个目录,但我不知道如何在第一个 post 答案中实现它:

这是我的文件布局:

MainFile(CurrentOne)
|
|-- Projects(the one I am scanning)
    #the following folders all have images in them but they are created at the same time as the folder
    |-- Folder 1
    |
    |-- Folder 2  
    |
    |-- Folder 3
    |
    |-- etc...

我之前的做法是:

我无法显示代码,因为我已经删除了那段代码,但我可以解释一下:

首先: 我首先使用 os.listdir(Projects)

获取文件夹中的目录列表

其次:我会检查我是否有大于5或小于或等于5

第三: 我会进入每个文件夹(我在第一次操作中将它们放入列表中)并使用 stats = os.stat(dirname) 获取有关它的信息。

第四: 我把所有的信息放在一个列表中 recent.insert(0, stats[8])

最后:我会比较所有的时间并得到其中的 5 个,但它们都是不正确的。

编辑

获得最近修改的文件后,我希望将该目录排除在扫描范围之外或仅扫描其他目录。例如假装文件夹 1 最近被修改并且 python 显示 folder 1。然后我想在扫描第二个最近修改的目录时排除该目录

阅读@tripleee 的评论后,我制作了这段获取最近修改的文件的代码。

import os

os.chdir('Folder')
projloc = os.getcwd() #getting the folder to scan

list_of_dirs_to_exclude = []

def get_recent_files():
    max_mtime = 0
    
    for root, dirs, files in os.walk(projloc):
        if root not in list_of_dirs_to_exclude: # I have made a change by adding the `not` in unlike @tripleee's answer
            for fname in files:
                full_path = os.path.join(root, fname)
                mtime = os.stat(full_path).st_mtime
                if mtime > max_mtime:
                    max_mtime = mtime
                    max_dir = root
                    max_file = fname

    list_of_dirs_to_exclude.insert(0, max_dir)
    print(max_file)

    if len(list_of_dirs_to_exclude) == 5: #You can keep whatever number you want such as 6, 7, 4 etc...
        pass

    else:
        get_recent_files()

get_recent_files()

如果您希望所有代码都在同一个def

中,这里是更新的代码
def get_recent_files():
    list_of_dirs_to_exclude = []
    list_of_dirs = []
    max_mtime = 0

    for dirs in os.listdir(projloc): #projloc is predefined for me. I got it using the same method in the above code
        list_of_dirs.insert(0, dirs)

    while len(list_of_dirs) != 5: 
        for root, dirs, files in os.walk(projloc):
            if root not in list_of_dirs_to_exclude:
                for fname in files:
                    full_path = os.path.join(root, fname)
                    mtime = os.stat(full_path).st_mtime
                    if mtime > max_mtime:
                        max_mtime = mtime
                        max_dir = root
                        max_file = fname

        list_of_dirs_to_exclude.insert(0, max_dir)
        print(max_file)
        max_mtime = 0

        if len(list_of_dirs_to_exclude) == 5:
            break