簡體   English   中英

如何阻止 os.walk 向下遍歷所有子目錄?

[英]How to stop os.walk from walking all sub-directories down?

使用:

def simpleFunc(dirName):
    import os
    fileList=[]
    for dir, dirs, filenames in os.walk(dirName):
        for filename in filenames:
            filepath=dir+'/'+filename
            fileList.append(filepath)
    print fileList


simpleFunc(os.path.dirname('/entire/path/to/file.ext'))

問題是os.walk並沒有停止在/entire/path/to/目錄級別,而是一直到它可以找到的最低子目錄。 因此,如果有/entire/path/to/subdir1/subdir2/subdir3那么除了/entire/path/to/所有三個子目錄都將被搜索: ./subdir1/ , ././subdir2/ , ./././subdir3/ . 問題:如何確保函數在指定的目錄級別停止: /entire/path/to/並且不會一直向下?

from os import listdir
from os.path import isfile, join
path='/entire/path/to/'
files = [ join(path,f) for f in listdir(path) if isfile(join(path,f)) ]

文件返回你的文件。 無需聲明新的文件列表

根據您編寫的內容,如果您只想搜索指定的目錄。 使用os.listdir然后只過濾os.path.isfile可能會更好,例如,像這樣:

def simple_func(dirpath):
    paths = os.listdir(dirpath)
    # create absolute paths
    abs_paths = [os.path.join(dirpath, p) for p in paths]
    # filter for paths that are files
    file_list = [p for p in paths if os.path.isfile(p)]
    return file_list

這樣您就不必處理停止遞歸的問題,並且很清楚您想要哪些文件。 您可能想要分析以查看多個isfile調用是否會造成任何傷害。

聽起來您應該改用os.listdir

import os

my_path = '/entire/path/to/files/'
file_list = []
for filename in os.listdir(my_path):
  filepath = os.path.join(my_path, filename)
  if os.path.isfile(filepath):
    fileList.append(filepath)

您需要從os.walk生成器中獲取唯一的第一項:

import os

root, _, files = next(os.walk('/entire/path/to'))

然后將根目錄附加到每個文件名:

files = map(lambda f: os.path.join(root, f), files)

要不就:

files = [os.path.join(root, f) for f in files]

您可以告訴 os.walk 明確使用哪個目錄

def simpleFunc(dirName):
    import os

    # set the dir name in a var
    dirName = '/higher_lever_dir/'

    for dir, dirs, filenames in os.walk(dirName):

        # this line forces loop to look ONLY in the specified dir
        dirs[:] = [d for d in dirs if d in dirName]

        for filename in filenames:
            filepath=dir+'/'+filename
            fileList.append(filepath)
    print fileList


simpleFunc(os.path.dirname('/entire/path/to/file.ext'))

設置 dirs[:] = [d for d in dirs if d in dirName] 將排除 /higher_level_dir/ 中可能存在的子目錄中的文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM