86

ルート、ディレクトリ、ファイルのループはos.walk(startdir)次の手順で機能しますか?

for root in os.walk(startdir) 
    for dir in root 
        for files in dir
  1. 開始ディレクトリのルートを取得: C:\dir1\dir2\startdir

  2. C:\dir1\dir2\startdir のフォルダーを取得し、フォルダーのリスト "dirlist" を返します

  3. dirlist の最初の項目でファイルを取得し、filelist のリストの最初の項目としてファイルのリスト "filelist" を返します。

  4. dirlist の 2 番目の項目に移動し、このフォルダー "filelist2" 内のファイルのリストを、ファイルリストのリストの 2 番目の項目として返します。等

  5. フォルダ ツリーの次のルートに移動し、2 から開始します。

右?それとも、最初にすべてのルートを取得し、2 番目にすべてのディレクトリを取得し、3 番目にすべてのファイルを取得しますか?

4

6 に答える 6

108

os.walk値のタプル (current_path、current_path 内のディレクトリ、current_path 内のファイル) を作成するジェネレーターを返します。

ジェネレーターが呼び出されるたびに、walk が呼び出された最初のディレクトリからサブディレクトリが使用できなくなるまで、各ディレクトリを再帰的にたどります。

そのような、

os.walk('C:\dir1\dir2\startdir').next()[0] # returns 'C:\dir1\dir2\startdir'
os.walk('C:\dir1\dir2\startdir').next()[1] # returns all the dirs in 'C:\dir1\dir2\startdir'
os.walk('C:\dir1\dir2\startdir').next()[2] # returns all the files in 'C:\dir1\dir2\startdir'

そう

import os.path
....
for path, directories, files in os.walk('C:\dir1\dir2\startdir'):
     if file in files:
          print('found %s' % os.path.join(path, file))

またはこれ

def search_file(directory = None, file = None):
    assert os.path.isdir(directory)
    for cur_path, directories, files in os.walk(directory):
        if file in files:
            return os.path.join(directory, cur_path, file)
    return None

または、ファイルを探したい場合は、これを行うことができます:

import os
def search_file(directory = None, file = None):
    assert os.path.isdir(directory)
    current_path, directories, files = os.walk(directory).next()
    if file in files:
        return os.path.join(directory, file)
    elif directories == '':
        return None
    else:
        for new_directory in directories:
            result = search_file(directory = os.path.join(directory, new_directory), file = file)
            if result:
                return result
        return None
于 2012-06-12T00:27:49.087 に答える
13

簡単に言えば、 os.walk() は、指定されたパスに存在するパス、フォルダー、ファイルのタプルを生成し、サブフォルダーを走査し続けます。

import os.path
path=input(" enter the path\n")
for path,subdir,files in os.walk(path):
   for name in subdir:
       print os.path.join(path,name) # will print path of directories
   for name in files:    
       print os.path.join(path,name) # will print path of files

これにより、すべてのサブディレクトリ、ファイル、およびサブディレクトリ内のファイルのパスが生成されます

于 2016-07-15T10:20:38.657 に答える
6

os.walk()がどのように機能するかの短い例と、いくつかのos関数を使用した説明を次に示します。

最初に、os.walk()は、ルート ディレクトリ、現在のルートのすぐ下にあるディレクトリのリスト ( )、およびそれらのディレクトリで見つかったファイルのリストの3 つの項目を返すことに注意してください。dirs詳細については、ドキュメントを参照してください。

dirsにはルート直下のディレクトリのリストが含まれ、files にはそれらのディレクトリにあるすべてのファイルのリストが含まれます。次の反復では、前のdirsリストにあるディレクトリの各ディレクトリがroot順番に の役割を果たし、そこから検索が続行され、現在のレベルが検索された後にのみレベルが下がります。

コード例: これは、指定された検索ディレクトリ (ルート) の下にある.jpg とファイルの名前を検索、カウント、出力します。.gifまた、os.path.splitext()関数を使用してファイルのベースを拡張子から分離し、 os.path.join( )関数を使用して、見つかった画像ファイルのパスを含む完全な名前を提供します。

import os

searchdir = r'C:\your_root_dir'  # your search starts in this directory (your root) 

count = 0
for root, dirs, files in os.walk(searchdir):
    for name in files:
        (base, ext) = os.path.splitext(name) # split base and extension
        if ext in ('.jpg', '.gif'):          # check the extension
            count += 1
            full_name = os.path.join(root, name) # create full path
            print(full_name)

print('\ntotal number of .jpg and .gif files found: %d' % count)
于 2012-06-12T00:27:48.673 に答える
2

os.walk は上記とは少し異なります。基本的に、(パス、ディレクトリ、ファイル) のタプルを返します。これを確認するには、次のことを試してください。

import pprint
import os
pp=pprint.PrettyPrinter(indent=4)
for dir_tuple in os.walk("/root"):
    pp.pprint(dir_tuple)

...ループの各反復で、ディレクトリ名、そのディレクトリ内のすぐ下にあるディレクトリの名前のリスト、およびそのディレクトリ内のすべてのファイルの別のリストが出力されることがわかります。os.walk は、サブディレクトリのリストに各ディレクトリを入力し、元のルートのすべてのサブディレクトリが走査されるまで、同じことを行います。これがどのように機能するかを理解するには、再帰について少し学ぶことが役立つ場合があります。

于 2012-06-12T00:24:57.723 に答える
1

私の答えは非常に基本的で単純です。私自身初心者であり、Web を検索して答えを見つけ (特にdocs.python.org の優れたドキュメントを参照)、次のようなテスト コードを試してみました。

for root, dirs, files in os.walk(startdir)
    print ("__________________")
    print (root)
    for file in files:
        print ("---",file)

これにより、ディレクトリ ツリーが出力されます。ここで、各ディレクトリ (開始ディレクトリと含まれるサブディレクトリ) の前に行があり、そこに含まれるファイルが続きます。

次の 2 点に注意する必要があると思います。

(1) os.walk は 3 タプル (トリプル) <root,dirs,filenames> を生成します。

  • root は、ルート ディレクトリの名前を含む文字列です。

  • dirs は文字列のリストです。ルートに直接含まれるディレクトリ名、つまり、最初のレベルに含まれるディレクトリ名で、サブディレクトリが含まれる可能性はありません。

  • filenames は文字列のリストです: root に直接含まれるファイル名です。

(2) 次のような for ループ

for root, subdirs, files in os.walk(YourStartDir)

ルートディレクトリとそのすべてのサブディレクトリをループします。ファイルごとに手順を実行する必要はありません。ディレクトリ ツリーをスキャンし、各ステップで (ツリー内の各ディレクトリに対して)、そこに含まれるファイル名のリストと、それに直接含まれるサブディレクトリのリストを埋めます。n 個のディレクトリ (ルートとそのサブディレクトリを含む) がある場合、for ループはn回ループします。つまり、 nステップかかります。これを確認するための短いテスト コードを記述できます。たとえば、カウンターを使用します。各ステップで、3 つのタプル (文字列と 2 つの (場合によっては空の) 文字列のリスト) を生成します。この例では、3 タプルの要素は "root"、"subdirs"、"files" と呼ばれていますが、これらの名前はあなた次第です。あなたのコードが

for a, b, c in os.walk(startdir)

3 タプルの要素は「a」、「b」、「c」と呼ばれます。

テストコードに戻りましょう:

for root, dirs, files in os.walk(startdir)
    print ("__________________")
    print (root)
    for file in files:
        print ("---",file)

最初のループ: root は入力で指定したディレクトリ (開始パス、開始ディレクトリ: 文字列)、 dirs は含まれるサブディレクトリ名のリスト (ただし、それらに含まれるディレクトリの名前ではない)、 files は含まれるファイルのリスト。テスト コードでは、リスト "dirs" を使用していません。

2 番目のループ: root は最初のサブディレクトリになり、dirs はそれに含まれるサブディレクトリのリスト、files はそれに含まれるファイルのリストになります。

...というように、ツリーの最後のサブディレクトリに到達するまで。

os.walk にはオプションの引数が 3 つあります。Web 上でそれらとその使用法に関する多くの情報を見つけることができますが、あなたの質問は os.walk の基本に関するものだと思います。

于 2021-07-19T09:20:13.850 に答える