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 \ data \ modules
    • \ 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]

ここでは、「modules」という名前のフォルダー内のファイルのみをチェックしています。そのチェックを変更して、他の何かを行うことができます。たとえば、モジュールがどこかにあるパスなどです。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 に答える