3

os.walk (またはその他の方法) を使用して、ルート ディレクトリの下の特定のパターンを持つディレクトリの下で特定の名前のファイルを見つけることができるように検索するにはどうすればよいですか?

つまり、ディレクトリ d:\installedApps があり、その下に a.ear、b.ear、... x.ear、y.ear、z.ear ディレクトリと同じレベルの他のディレクトリがあり、ファイル パターン web*.xml をルートの下の *.ear サブディレクトリの下でのみ検索したいのですが、同じレベルの他のディレクトリをたどることはありません。どうすればよいですか?

さまざまな方法を試しました (このサイトの walklevel の例などの他の例を使用するものもあります) が、必要な結果が得られません。

アップデート

このサイトの walkdepth コード スニペットを使用して、ネストされたループに結合しようとしましたが、うまくいきません

これは私が試したコードです

import os, os.path
import fnmatch

def walk_depth(root, max_depth):
    print 'root in walk_depth : ' + root
    # some initial setup for getting the depth
    root = os.path.normpath(root)
    depth_offset = root.count(os.sep) - 1

    for root, dirs, files in os.walk(root, topdown=True):
        yield root, dirs, files
        # get current depth to determine if we need to stop
        depth = root.count(os.sep) - depth_offset
        if depth >= max_depth:
            # modify dirs so we don't go any deeper
            dirs[:] = []

for root, dirs, files in walk_depth('D:\installedApps', 5):
    for dirname in dirs:
        if fnmatch.fnmatch(dirname, '*.ear'):
            print 'dirname : ' + dirname
            root2 = os.path.normpath(dirname)
            for root2, dir2, files2 in walk_depth(root2, 5):
                for filename in files2:
                    if fnmatch.fnmatch(filename, 'webservices.xml'):
                        print '\tfilename : ' + filename
4

1 に答える 1

4

この回答を見ることを強くお勧めします。3 つの異なる解決策がありますが、#1 があなたがしようとしていることと最も正確に一致しているようです。

Pythonで拡張子が.txtのディレクトリ内のすべてのファイルを検索します

EDIT仕事をする可能性のある glob クラスに関する詳細情報を見つけました。

Python ドキュメントから

glob.glob(パス名)

pathname に一致するパス名の空のリストを返します。これは、パス指定を含む文字列でなければなりません。pathname は、絶対 ( など/usr/src/Python-1.5/Makefile) または相対 ( など ../../Tools/*/*.gif) にすることができ、シェル スタイルのワイルドカードを含めることができます。壊れたシンボリック リンクが結果に含まれます (シェルと同様)。

したがって、次の行に沿って何かを行うことができます。

def getFiles(path):
    answer = []
    endPaths = glob.glob(path + "web*.xml")
    answer += endPaths
    if len(glob.glob(path + "*ear/")) > 0:
            answer += getFiles(path + "*ear/")

    return answer

filepaths = getFiles("./")
print(filepaths

)

私は実際にそれをテストしましたが、あなたが望むように設定されていると思うディレクトリで素晴らしく動作します.

于 2013-12-03T14:53:34.070 に答える