2012-07-12 58 views
4

好吧,我不仅在问题本身遇到问题,而且即使试图解释我的问题。我有一个目录树由大约7次迭代,所以:rootdir/a/b/c/d/e/f/destinationdirPython Glob.glob:根和目标之间的目录数量的通配符

的事情是有的可有5倍子目录的水平,有些可能有多达十个,如:

rootdir/a/b/c/d/destinationdir 

或:

rootdir/a/b/c/d/e/f/g/h/destinationdir

它们唯一共同的地方是目标目录总是被命名为相同的东西。我使用的水珠功能的方法如下:

for path in glob.glob('/rootdir/*/*/*/*/*/*/destinationdir'):
--- os.system('cd {0}; do whatever'.format(path))

然而,这仅适用于具备中级子目录是精确数量的目录。有什么办法可以让我不必指定那个数字subdirectories(asterices);换句话说,无论中间子目录的数量是多少,函数都会到达destinationdir,并允许我遍历它们。非常感谢!

回答

4

我认为这可能与os.walk更容易做到:

def find_files(root,filename): 
    for directory,subdirs,files in os.walk(root): 
     if filename in files: 
      yield os.join(root,directory,filename) 

当然,这并不让你在文件名部分的全局正则表达式,但你可以使用正则表达式检查的东西或的fnmatch。

编辑

或者查找目录:

def find_files(root,d): 
    for directory,subdirs,files in os.walk(root): 
     if d in subdirs: 
      yield os.join(root,directory,d) 
1

您可以为缩进的每个级别(增加10如果需要的话)的模式:

for i in xrange(10): 
    pattern = '/rootdir/' + ('*/' * i) + 'destinationdir' 
    for path in glob.glob(pattern): 
     os.system('cd {0}; do whatever'.format(path)) 

这将遍历:

'/rootdir/destinationdir' 
'/rootdir/*/destinationdir' 
'/rootdir/*/*/destinationdir' 
'/rootdir/*/*/*/destinationdir' 
'/rootdir/*/*/*/*/destinationdir' 
'/rootdir/*/*/*/*/*/destinationdir' 
'/rootdir/*/*/*/*/*/*/destinationdir' 
'/rootdir/*/*/*/*/*/*/*/destinationdir' 
'/rootdir/*/*/*/*/*/*/*/*/destinationdir' 
'/rootdir/*/*/*/*/*/*/*/*/*/destinationdir' 

如果你有遍历任意深度的目录那么我建议将算法分为两个步骤:您调查所有'destinationdir'目录所在的位置的一个阶段,以及您执行操作的第二个阶段。

1

使用更多功能的工具(如find命令(您的os.system调用表明您处于类似unix的系统,因此这将起作用))看起来更容易完成。

os.system('find /rootdir -mindepth 5 -maxdepth 10 -type d -name destinationdir | while read d; do (cd $d && do whatever;); done') 

..Note,如果你打算把所有用户提供的字符串转换成该命令,这种急剧变不安全的,你应该使用subprocess.Popen代替,执行外壳和分裂自己的论点。尽管如此,它是安全的。

2

如果您正在寻找的文件,你可以使用Formic package(披露:我写的) - 这个实现的Apache Ant的文件集水珠与'**'通配符:

import formic 
fileset = formic.FileSet(include="rootdir/**/destinationdir/*") 

for file_name in fileset: 
    # Do something with file_name