![](/img/trans.png)
[英]How to loop over sub-directories within a root directory using 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.