我在这里做点什么,我完全糊涂了。基本上,我在我的目录中有脚本,并且该脚本必须在具有特定扩展名的多个文件夹上运行。现在,我把它放在一个文件夹上运行。这是结构,我有一个主文件夹说,Python,里面我有多个文件夹都使用相同的.ext,并且在每个子文件夹中我再次有几个文件夹,其中我有工作文件。 现在,我希望脚本访问整个路径说,我们在主文件夹'python'里面,我们在其中有folder1.ext->子文件夹1 - >工作文件,再次出来了回去到主文件夹'Python'并开始访问第二个目录。 现在脑子里有很多东西,包括glob模块,os.walk或for循环。我的逻辑错了。我迫切需要一些帮助。
Say,Path = r'\ path1'
我该如何开始?非常感谢任何帮助。
答案 0 :(得分:0)
我不确定这是否是您想要的,但这个带有递归辅助函数的主函数会获取主目录中所有文件的字典:
import os, os.path
def getFiles(path):
'''Gets all of the files in a directory'''
sub = os.listdir(path)
paths = {}
for p in sub:
print p
pDir = os.path.join(path, p)
if os.path.isdir(pDir):
paths.update(getAllFiles(pDir, paths))
else:
paths[p] = pDir
return paths
def getAllFiles(mainPath, paths = {}):
'''Helper function for getFiles(path)'''
subPaths = os.listdir(mainPath)
for path in subPaths:
pathDir = os.path.join(path, p)
if os.path.isdir(pathDir):
paths.update(getAllFiles(pathDir, paths))
else:
paths[path] = pathDir
return paths
这将返回{'my_file.txt': 'C:\User\Example\my_file.txt', ...}
形式的字典。
答案 1 :(得分:0)
由于您将第一级目录与其子目录区分开来,您可以执行以下操作:
# this is a generator to get all first level directories
dirs = (d for d in os.listdir(my_path) if os.path.isdir(d)
and os.path.splitext(d)[-1] == my_ext)
for d in dirs:
for root, sub_dirs, files in os.walk(d):
for f in files:
# call your script on each file f
答案 2 :(得分:0)
您可以使用Formic(披露:我是作者)。 Formic允许您指定一个多目录glob来匹配您的文件,从而消除目录行走:
import formic
fileset = formic.FileSet(include="*.ext/*/working-file", directory=r"path1")
for file_name in fileset:
# Do something with file_name
需要注意的几点:
/*/
匹配每个子目录,而/**/
递归地下降到每个子目录,子目录等等。一些选择:
*.ext
下方的一个目录,请使用/*/
*.ext
下的任意深度,请改用/**/
。/*/**/
directory=r"path1"
working-file
。如果没有,请替换匹配它的glob,例如*.sh
或script-*
。