4

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

旧代码是什么样的

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_FOLDER\数据\模块
    • \folder1\data\modules
    • \folder2\data\modules
    • \folder3\data\modules

其中 folder1,2 或 3,可以是任何文本字符串

我如何重写上面的代码来做到这一点...有人告诉我 os.walk 但我只是在学习 Python...所以任何帮助表示赞赏

4

4 回答 4

8

您只需调用没有什么太大的变化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]

在这里,我只检查名为“模块”的文件夹中的文件,您可以更改该检查以执行其他操作,例如在某处具有模块的路径root.find('/modules') >= 0

于 2012-10-30T00:19:24.457 回答
1

os.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

试试看,应该是相当自我解释它是如何工作的......

于 2012-10-30T00:34:26.780 回答
0

您可以os.walk像@Anurag 详细说明的那样使用,也可以试试我的小型pathfinder库:

data = [parse_file(f) for f in pathfinder.find(GSB_FOLDER), just_files=True]
于 2012-10-30T00:26:52.757 回答
0

创建了一个函数,该函数具有爬取目录结构并返回匹配模式的文件和/或路径的一般目的。

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]

示例用法:

  • directory_spider('/path/to/find') --> 如果存在,则查找路径中前 500 个文件
  • directory_spider('/path/to/find',path_pattern="",file_pattern=".py$", maxResults=10)
于 2019-04-17T21:48:13.420 回答