0

ループから目的の出力を取得するための少しの支援を探しています。

'published'という名前のフォルダに至るまでのパスのリストをコンパイルしようとしています。ほぼ機能しますが、「published」の子であるディレクトリがループから吐き出されるのを防ぐ方法を誰かに教えてもらえれば幸いです。

import os

file = open('published_directories_list.txt', 'w');
top = "T:\PROJECTS";

for root, dirs, files in os.walk(top, topdown=False):
    for name in dirs:
        myPath = os.path.join(root, name);

        if 'published' in myPath:
            print (myPath);
            file.write(myPath + '\n');
        else:
            print (myPath + ' - no published directory!');

file.close();

print('DONE!');
4

2 に答える 2

1

何が起こっているのかというと、 。os.walkの下のすべてのディレクトリを繰り返し処理するということtopです。したがって、次のようなディレクトリ構造がある場合:

top
  |
  - published
  |  |
  |  - something
  |
  - other

あなたのループのある時点であなたのライン:

myPath = os.path.join(root, name)

のルート/top/publishedとの名前に参加しsomethingます。明らかに、それなら、あなたがチェックするとき、if "published" is in myPathそれはそうなるでしょう。のサブディレクトリをpublished見ている場合でも、パスに「published」という名前が表示されています。

この問題を修正する簡単な方法は、単にそれが含まれているかどうかをチェックするのではなく、( endswith stringメソッドmyPathを使用して)「published」で終わるかどうかをチェックすることです。次のようにステートメントを変更できます。if

if myPath.endswith('/published')

チェックしているものの先頭にバックスラッシュを含めたことに注意してください。これにより、「未公開」とも一致させたくないというDSMのポイントが修正されるはずです。

于 2012-04-11T17:07:08.157 に答える
0
>>> import os
>>> folder = 'MUI'
>>> for root, dirs, files in os.walk('C:\\windows'):
    for dir_ in dirs:
        if folder.lower() == dir_.lower():
            print os.path.join(root, folder)
            dirs.remove(dir_)


C:\windows\MUI
C:\windows\AppPatch\MUI
C:\windows\Help\MUI
C:\windows\Help\Tours\htmlTour\MUI
C:\windows\Help\Tours\mmTour\MUI
C:\windows\Help\Tours\WindowsMediaPlayer\MUI
C:\windows\Microsoft.NET\Framework\v2.0.50727\MUI
C:\windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\MUI
C:\windows\pchealth\MUI
C:\windows\Resources\Themes\Luna\MUI
C:\windows\Resources\Themes\Luna\Shell\Homestead\MUI
C:\windows\Resources\Themes\Luna\Shell\Metallic\MUI
C:\windows\Resources\Themes\Luna\Shell\NormalColor\MUI
C:\windows\srchasst\MUI
C:\windows\system32\MUI
C:\windows\system32\oobe\MUI
C:\windows\system32\wbem\MUI
C:\windows\Web\MUI

はい、繰り返しながら触れることができますdirs(子供がここで閲覧されないように)!!

Windowsは大文字と小文字を区別しないため、小文字で比較を使用しましたが、大文字と小文字は表示されます。Unixライクなシステムではif folder in dirs、ループなしのような比較が良い方法です。

于 2012-04-11T17:17:55.547 に答える