2

初めての投稿なのでお手柔らかに。;)

問題: os.walk をディレクトリ ウォーカーとして使用できるようにしたいのですが、特定のフォルダには使用できません。元:

木:

\Proj1_0
    \Load001
        \lib
        \src
\Proj2_0
    \Load001
        \lib
        \src
    \Load002
        \lib
        \src

プロジェクトと負荷を表示したいのですが、負荷の下のサブディレクトリは表示したくありません。次のコードを使用してそれを行うことができます。

import os


for root, subFolders, files in os.walk('.'):
    # root does NOT contain 'Load'
    if root.find('Load') == -1:
        print "\nPROJECT: " + root + "\n"
        for folder in subFolders:
            print "    " + folder

ただし、リストは大きなリストであるため、 del を使用してみましたが、正しく機能させることができず、次のようなリストを使用して同じことを行うことができませんでした (これは別の投稿から取得しました)。

def my_walk(top_dir, ignore):
    for dirpath, dirnames, filenames in os.walk(top_dir):
        dirnames[:] = [
            dn for dn in dirnames
            if os.path.join(dirpath, dn) not in ignore]
        yield dirpath, dirnames, filename
list my_walk('.','Load')

しかし、リターンも正常に動作するようにはなりませんでした。私はPythonが初めてで、助けていただければ幸いです。ありがとう!

4

3 に答える 3

2

試す:

    dirnames[:] = [
        dn for dn in dirnames
        if ignore not in os.path.join(dirpath, dn)]

文字列を含まないディレクトリを保持したい。os.path.join(dirpath, dn)ignore


ちなみに、dirnames[:]割り当ての左側で使用するのは正しいです。がアクセスするディレクトリを整理os.walkするには、同じリストを変更する必要がありますdirnames

dirnames[:] = ...同じリストをその場で変更します。 dirnames = ...名前を別の値にリダイレクトしdirnamesます。

于 2012-09-25T18:25:38.670 に答える
1

次のことを試すことができます。

for x in os.walk('.', topdown=True):
    dirpath, dirnames, dirfiles = x
    print(dirpath, dirnames)
    dirnames[:] = filter(lambda x : not x.startswith('Load'), dirnames)

から、検索を制限するためにif ishelp(os.walk)を変更できます。namestopdownTrue

于 2012-09-25T18:22:04.177 に答える
0

ところで、これは私が最終的に得たものです...

import os,string
path = '.'
path = os.path.normpath(path)
res = []

for root,dirs,files in os.walk(path, topdown=True):
    depth = root[len(path) + len(os.path.sep):].count(os.path.sep)
    if depth == 2:
        # We're currently two directories in, so all subdirs have depth 3
        res += [os.path.join(root, d) for d in dirs]
        dirs[:] = [] # Don't recurse any deeper
print(res)

これは古い投稿であることは知っていますが、回答で更新する必要があると思いました。場合によっては、他の誰かがそれを便利だと思うでしょう。

于 2013-07-16T23:30:38.450 に答える