2011-03-08 3 views
3

を歩いていない、私はPythonのos.walk()のこの一見非常に奇妙な行動に走った:私はそれにいくつかのディレクトリを渡すとき、それだけで何もしません。しかし、親ディレクトリを渡すと、パスに直接渡されたときに動作しないように見えるパスで正しく再帰します。例えばos.walkが

F:\音楽
[...]
F:\音楽\テスト
F:\音楽

for root, _, _ in os.walk('F:\music'): 
    print(root) 

は、次の出力を生成\ test \ broken
F:¥music¥test¥broken¥Boards_Of_Canada
F:¥music¥test¥broken¥Brian_Eno
[...]

しかし、私はFで試してみてください(os.walk()が親に呼ばれたときだけで罰金に再帰た)\音楽\テストなど:

for root, _, _ in os.walk('F:\music\test'): 
    print(root) 

私は出力がまったく得られない。

誰も何が起こっているのか考えていますか?私は何か間違っているのですか?それはos.walk()のいくつかの奇妙な制限ですか?私は本当に混乱しています。

+5

'/'(スラッシュ)をパス区切り記号として使用すると同じ動作が起こりますか? –

答えて

18

あなたの問題はここにある:

for root, _, _ in os.walk('F:\music\test'): 
    print(root) 

... Pythonがあなたのパスを含む文字列を解析するとき、それはタブ文字として\tを解釈します。パス文字列リテラルは、'f:\\music\\test'またはr'F:\music\test'(そのままの理由で存在する生の文字列)として書き直すことができます。

+5

これはウィンドウを嫌う1つの理由です。 –

+1

D'OOOH !!!どの初心者の間違い。本当にありがとう! – joce

+2

@Jakob - 多くの理由の1つ::) – bgporter

7

あなたは常に前方に使うべきでもWindows上で、パスのスラッシュバックスラッシュではありません。何が起こっているのは、\ tがスラッシュティーではなくタブとして解釈されていることです。

+0

'\\?\'を実行し、スラッシュはもう使用できなくなります。バッチの 'DEL'コマンドでも同じですが、これはパスでスラッシュを使用している間は私には失敗しました。 –

2

os.path.normpathを使用し、任意のスラッシュとバックスラッシュ のように、問題の解決に役立つだけでなく、この時点でコードをクロスプラットフォームにすることになります

os.walk(os.path.normpath( 'F:/ music/test' )):

関連する問題