recursion子文件夹search和返回列表python中的文件

我正在一个脚本recursion通过主文件夹中的子文件夹,并build立一个列表closures某种文件types。 我正在处理脚本的问题。 目前设置如下

for root, subFolder, files in os.walk(PATH): for item in files: if item.endswith(".txt") : fileNamePath = str(os.path.join(root,subFolder,item)) 

问题是子文件夹variables拉动子文件夹列表,而不是ITEM文件所在的文件夹。 我想为之前的子文件夹运行一个for循环,并joinpath的第一部分,但我认为,Id仔细检查,看看有没有人有任何build议之前。 谢谢你的帮助!

你应该使用你称为rootdirpath 。 提供的dirnames ,所以你可以修剪它,如果有文件夹,你不希望os.walkrecursion。

 import os result = [os.path.join(dp, f) for dp, dn, filenames in os.walk(PATH) for f in filenames if os.path.splitext(f)[1] == '.txt'] 

编辑:

在最新的倒退之后,我想到glob是一个更好的select扩展的工具。

 import os from glob import glob result = [y for x in os.walk(PATH) for y in glob(os.path.join(x[0], '*.txt'))] 

也是一个生成器版本

 from itertools import chain result = (chain.from_iterable(glob(os.path.join(x[0], '*.txt')) for x in os.walk('.'))) 

Python 3.5中改变了:使用“**”支持recursion球。

glob.glob()得到了一个新的recursion参数

如果你想得到PATH下的每个.txt文件(recursion地包括子目录):

 import glob files = glob.glob(PATH + '/**/*.txt', recursive=True) # PATH/ the dir # **/ every file and dir under PATH # *.txt every file that ends with '.txt' 

如果你需要一个迭代器,你可以使用iglob作为替代:

 for file in glob.iglob(pathname, recursive=False): # ... 

它不是最pythonic的答案,但我会把它放在这里的乐趣,因为这是一个recursion的教训

 def find_files( files, dirs=[], extensions=[]): new_dirs = [] for d in dirs: try: new_dirs += [ os.path.join(d, f) for f in os.listdir(d) ] except OSError: if os.path.splitext(d)[1] in extensions: files.append(d) if new_dirs: find_files(files, new_dirs, extensions ) else: return 

在我的机器上,我有两个文件夹, rootroot2

 mender@multivax ]ls -R root root2 root: temp1 temp2 root/temp1: temp1.1 temp1.2 root/temp1/temp1.1: f1.mid root/temp1/temp1.2: f.mi f.mid root/temp2: tmp.mid root2: dummie.txt temp3 root2/temp3: song.mid 

比方说,我想要find这些目录中的所有.txt和所有.mid文件,然后我可以做

 files = [] find_files( files, dirs=['root','root2'], extensions=['.mid','.txt'] ) print(files) #['root2/dummie.txt', # 'root/temp2/tmp.mid', # 'root2/temp3/song.mid', # 'root/temp1/temp1.1/f1.mid', # 'root/temp1/temp1.2/f.mid']