2009-02-23 11 views
7

Unixでは、すべてのディスクがメインファイルシステム内のパスとして公開されていますので、os.walk('/')は、たとえば/media/cdromとプライマリハードディスクをトラバースするため、一部のアプリケーションでは望ましくありません。Pythonのos.walkがマウントポイントを通過するのを防ぐにはどうしたらいいですか?

os.walkを1つのデバイスに保存するにはどうすればよいですか?

関連:

+0

http://stackoverflow.com/questions/530645/is-there-a-way-to-determine-if-a-subdirectory-is-in-the-same-filesystem-from-pyth/530692#530692 – sykora

答えて

15

ではないことを確認する:トップダウンがtrueの場合、呼び出し側が インプレースにdirnamesリストを変更することができます

(おそらくデルまたはスライス 割り当てを使用して)、walk()は の名前がディレクトリ名に残っているサブディレクトリに再帰します; これは、このようなものが動作するはずですので、検索

を剪定するために使用することができ :

for root, dirnames, filenames in os.walk(...): 
    dirnames[:] = [ 
    dir for dir in dirnames 
    if not os.path.ismount(os.path.join(root, dir))] 
    ... 
+0

は素晴らしく簡潔な答えです。 –

1

os.walk()は、それが別のドライブを閲覧していること(私の知る限りでは)言うことができません。自分で確認する必要があります。

os.stat()を使用してみてください、またはos.walkドキュメントからos.walk()からルート変数が/media

3

私はos.path.ismountはあなたのために働くかもしれないと思います。あなたのコードは次のようになります。

import os 
import os.path 
for root, dirs, files in os.walk('/'): 
    # Handle files. 
    dirs[:] = filter(lambda dir: not os.path.ismount(os.path.join(root, dir)), 
        dirs) 

また、あなたのソリューションを構築するのに役立つthis answerを見つけることができます。

* dirsを正しくフィルタリングしていただきありがとうございます。

+0

ディレクトリを再割り当てすることはできません。 – Constantin

+0

あなたは、コードを "dirs [:] = filter(...)"に変更して、リストの代わりに再配列する代わりにリストを突然変異させることで修正できます – Brian

関連する問題