Python 在文件夹结构中爬行

Python 在文件夹结构中爬行,python,os.walk,Python,Os.walk,我有一些代码可以查看单个文件夹并提取文件。 但是现在文件夹结构已经改变,我需要在文件夹中搜索匹配的文件 旧代码是什么样子的 GSB_FOLDER = r'D:\Games\Gratuitous Space Battles Beta' def get_module_data(): module_folder = os.path.join(GSB_FOLDER, 'data', 'modules') filenames = [os.path.join(module_folder

我有一些代码可以查看单个文件夹并提取文件。 但是现在文件夹结构已经改变,我需要在文件夹中搜索匹配的文件

旧代码是什么样子的

GSB_FOLDER = r'D:\Games\Gratuitous Space Battles Beta' 

def get_module_data():
    module_folder = os.path.join(GSB_FOLDER, 'data', 'modules')

    filenames = [os.path.join(module_folder, f) for f in
                  os.listdir(module_folder)]

    data = [parse_file(f) for f in filenames]

    return data
但现在文件夹结构已更改为如下所示

  • GSB_文件夹\数据\模块
    • \folder1\数据\模块
    • \folder2\数据\模块
    • \folder3\数据\模块
其中folder1、2或3可以是任何文本字符串

我如何重写上面的代码来实现这一点。。。
我听说过os.walk,但我只是在学习Python。。。因此,任何帮助都不会有太大变化,只要调用
os.walk
,它就会递归地遍历目录并返回文件,例如

for root, dirs, files in os.walk('/tmp'):
    if os.path.basename(root) != 'modules':
        continue
    data = [parse_file(os.path.join(root,f)) for f in files]

在这里,我只检查名为“modules”的文件夹中的文件。您可以更改该检查以执行其他操作,例如,在某个地方有module
根目录的路径。find(“/modules”)>=0

您可以使用
操作系统。walk
如@Anurag有详细说明,或者您可以尝试我的小程序库:


walk是一种很好的简单方法,它可以让您获得所传递目录中所有内容的目录结构

在您的示例中,您可以执行以下操作:

for dirpath, dirnames, filenames in os.walk("...GSB_FOLDER"):
  #whatever you want to do with these folders
  if "/data/modules/" in dirpath:
    print dirpath, dirnames, filenames

试一试,它的工作原理应该是不言自明的…

创建了一个函数,该函数用于在目录结构中爬行,并返回与模式匹配的文件和/或路径

import os
import re
import sys

def directory_spider(input_dir, path_pattern="", file_pattern="", maxResults=500):
    file_paths = []
    if not os.path.exists(input_dir):
        raise FileNotFoundError("Could not find path: %s"%(input_dir))
    for dirpath, dirnames, filenames in os.walk(input_dir):
        if re.search(path_pattern, dirpath):
            file_list = [item for item in filenames if re.search(file_pattern,item)]
            file_path_list = [os.path.join(dirpath, item) for item in file_list]
            file_paths += file_path_list
            if len(file_paths) > maxResults:
                break
    return file_paths[0:maxResults]
示例用法:

  • 目录_spider('/path/to/find')-->查找路径中的前500个文件(如果存在)
  • 目录_spider('/path/to/find',path_pattern=“”,file_pattern=“.py$”,maxResults=10)

是否有办法只包含命名为模块的文件夹。@MatGritt如无更改,您可以根据根路径进行筛选
import os
import re
import sys

def directory_spider(input_dir, path_pattern="", file_pattern="", maxResults=500):
    file_paths = []
    if not os.path.exists(input_dir):
        raise FileNotFoundError("Could not find path: %s"%(input_dir))
    for dirpath, dirnames, filenames in os.walk(input_dir):
        if re.search(path_pattern, dirpath):
            file_list = [item for item in filenames if re.search(file_pattern,item)]
            file_path_list = [os.path.join(dirpath, item) for item in file_list]
            file_paths += file_path_list
            if len(file_paths) > maxResults:
                break
    return file_paths[0:maxResults]