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议之前。 谢谢你的帮助!
你应该使用你称为root
的dirpath
。 提供的dirnames
,所以你可以修剪它,如果有文件夹,你不希望os.walk
recursion。
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
在我的机器上,我有两个文件夹, root
和root2
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']