2

いくつかのファイル、いくつかのディレクトリ、ファイルへのいくつかのシンボリックリンク、およびディレクトリへのいくつかのシンボリックリンクを含むディレクトリがあります。

ディレクトリでfollowlinks=falseを指定してos.walk()を実行すると、ファイル名リストのファイルとファイルへのシンボリックリンク、およびディレクトリ名リストのディレクトリが取得されます。ただし、ディレクトリへのシンボリックリンクはどこにも表示されません。これはPythonのバグまたは機能ですか、それとも何か間違ったことをしていますか?

ディレクトリではなくシンボリックリンクであり、他の(他のファイルへの)シンボリックリンクがファイル名リストに表示されるため、ディレクトリへのシンボリックリンクがファイル名リストに表示されることを期待しています。

例:ディレクトリfooには次のものが含まれています。

-rw-rw-r-- 4 rikno staff 136 Jan 14 11:10 firefox
lrwxr-xr-x 1 rikno staff   5 Jan 23 13:29 latex -> tetex
lrwxr-xr-x 2 rikno staff  68 Jan 14 11:10 mozilla -> firefox
drwxrwxr-x 3 rikno staff 102 Jan 23 13:29 tetex

最初の反復でos.walk('foo')が返されることを期待しています

('foo', ['tetex'], ['firefox', 'latex', 'mozilla'])

または少なくとも

('foo', ['latex', 'tetex'], ['firefox', 'mozilla'])

しかし、私が得るのは

('foo', ['tetex'], ['firefox', 'mozilla'])

シンボリックリンクラテックス(ディレクトリtetexを指す)については何もわかりません

解決済み:

わかりました、結果

('foo', ['latex', 'tetex'], ['firefox', 'mozilla'])

したがって、ディレクトリへのシンボリックリンクがdirnamesリストに表示されます。

私は最初、ディレクトリへのシンボリックリンクがファイル名リストにあることを期待し、dirnamesリストを調べたことはありませんでした。コードとファイルシステムを試して、リンクがどこにあるか、またはリンクが「欠落」している理由を見つけたときに、誤って混同してしまいました。私の結果。

質問してすみません。

4

2 に答える 2

2

os.walk()followlinks設定して呼び出したと書いていますFalse。さて、それは期待される動作です:

デフォルトでは、walk()ディレクトリに解決されるシンボリックリンクに移動しません。シンボリックリンクをサポートするシステムで、シンボリックリンクが指すディレクトリにアクセスするように設定followlinksします。True

于 2013-01-23T15:30:30.910 に答える
2

私のマシンで実行すると、os.walk()すべてのシンボリックリンクが表示されます:

>>> os.walk("foo").next()
('foo', ['tetex', 'latex'], ['mozilla', 'firefox'])
>>> os.walk("foo", followlinks=False).next()
('foo', ['tetex', 'latex'], ['mozilla', 'firefox'])

ここで私が目にする唯一の「問題」は、シンボリックリンクがファイルのリストではなく、ディレクトリのリストに表示されることです。

ほとんどの使用例では、ファイル リスト内のすべてのエントリをファイルとして扱うことができ、それがシンボリック リンクであるかどうかを確認する必要がないため、これは予期される動作です。

python-dev のこのスレッドでは、この問題について簡単に説明しています。

「...ディレクトリへのシンボリックリンクをサブディレクトリリストの代わりにファイルリストに入れることは、実際にはそれほど良くありません(実際にファイルの内容を読みたいなど、別のユースケースに問題を移すだけです)。 "

リンクされた問題ページから:

「たとえば、ディレクトリの下にあるすべてのファイルの行数をカウントするには、コードは次のようになります。

for root, dirs, files in os.walk(top):
    for file in files:
        f = open(file)
        for n, l in enumerate(f, 1):
            pass
        print(file, n)

ディレクトリへのシンボリックリンクが突然ファイルに現れた場合、これは壊れます。したがって、これを変更する価値があるとは確信していません。ディレクトリへのシンボリック リンクは、ディレクトリよりもファイルに近いというわけではなく、ユース ケースに大きく依存します。」

于 2013-01-23T15:56:06.110 に答える