【问题标题】:Python code to search a folder(not file) inside another folder用于在另一个文件夹中搜索文件夹(不是文件)的 Python 代码
【发布时间】:2014-05-20 16:34:14
【问题描述】:

我对 python 很陌生,我需要搜索一个名称如下的文件夹:vvl*cpp,并且始终存在于名为 test 的目录中。但问题是测试目录的深度是未知的。

我试过了:

dir_name=glob.glob('./[a-z,_]*/test/vvl*cpp')
    file_dict={}
    for i in dir_name:
        name=re.compile(r"\.\/[a-z,_]*\/test\/vvl_")
        file_name=name.sub("",i)
        file_dict[file_name]=i

for key in sorted(file_dict.iterkeys()):
    print "%s: %s" % (key, file_dict[key])

但它只在子目录中搜索,但正如我提到的,我不知道测试目录的深度。可能是 1,也可能是 10。请给我一些出路。我正在使用python2.6

【问题讨论】:

标签: python unix


【解决方案1】:

我会这样做 - 使用 os.walk 抓取树,使用 lambda 检查您的情况,并使用列表理解累积匹配项:

cond = lambda x, y: os.path.basename(x) == 'test' and 
                    y.startswith('vvl') and y.endswith('cpp')
matches = (os.path.join(r, d) for r, d, f in os.walk(tree) if cond(r, d))

希望这就是你的意思,有点不清楚。

【讨论】:

    【解决方案2】:

    如果您认为需要两个组件,这很简单:

    1. 递归遍历目录的函数。
    2. 检查目录是否匹配的函数。

    对于第一个:

    def walk_tree(path):
        for root, dirs, files in os.walk(path):
            for dir in dirs:
                yield root, dir
    

    第二个:

    def is_a_match(dirparent, dirname):
        return os.path.basename(dirparent) == "test" and \
        dirname.startswith("vvl") and dirname.endswith("cpp")
    

    现在把它们放在一起:

    def iter_targets(path):
        for dirparent, dirname in walk_tree(path):
            if is_a_match(dirparent, dirname):
                yield os.path.join(dirparent, dirname)
    

    【讨论】:

    • 感谢@doukremt,它很好地达到了目的
    • 我喜欢!非常整洁!
    【解决方案3】:

    你可以使用os.walk()方法。

    import os
    
    folders = []
    
    for path, dirs, files in os.walk(starting_path):
        folders.append(path)
        print path
    

    【讨论】:

      【解决方案4】:

      我喜欢这段代码中的逻辑:

      for myDir, myDirs, myFilenames in os.walk(myPath):
          print type(myDir), myDir
          print type(myDirs), myDirs
          print type(myFilenames), myFilenames
      

      您可以使用 os.path 方法解决其余问题,例如:os.path.abspath()、os.path.dirname() 等

      【讨论】:

        猜你喜欢
        • 2021-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多