2017-04-21 24 views
0

ここでは私のためにどのような作品のデモで、指定したディレクトリの結果を必要としない何を:エラーが発生しました - 私は

import os 
path2 = 'D:\\' 

# this works 
for curdir, dirlist, flist in os.walk(path2): 
    pass 

# this fails 
curdir, dirlist, flist = os.walk(path2) 
+0

となぜあなたが動作するはず失敗1は信じていますか? – Vallentin

+0

'os.walk'はゼロ個以上の3タプルを生成します。アンパックする値が少なすぎたり、アンパックする値が多すぎたりすると、割り当てが失敗します。ちょうど3回の収穫を除いて。その場合でも結果はあなたが期待するものではありません。 –

答えて

2

事がos.walk()は、発電機を返すことです。そうすること:

curdir, dirlist, flist = os.walk(path2) 

おそらく、うまくいかない場合があります。

まず者はこのことを考えてみましょう:

for curdir, dirlist, flist in os.walk(path2): 
    pass 

これは、本質的に名前にos.walk()によって返された発電機を割り当て、連続StopIterationが発生するまで、その上next()を呼び出すのと同じです。発電機は、その3つの以上の値が得られた場合

walk = os.walk(path2) 
curdir = next(walk) 
dirlist = next(walk) 
flist = next(walk) 

を:今

walk = os.walk(path2) 

try: 
    while True: 
     dirpath, dirnames, filenames = next(walk) 

     ... do something ... 
except StopIteration: 
    pass 

我々は他の例に戻る場合:上記その後

curdir, dirlist, flist = os.walk(path2) 

はやってと同じです失敗しません。しかし、3より小さい値が得られた場合は、解凍する値が3未満であるため、失敗します。

したがって、os.walk()で返されたジェネレータでは、1つの値しか得られません。

curdir, dirlist, flist = os.walk(path2) 

そして、上記の次のようなエラーになります:

ValueError: not enough values to unpack (expected 3, got 1)

あなたが最初の値のみを必要とするので、それはだ場合は、先に行くと直接next()を呼び出します。しかし、潜在的な潜在的なものをキャッチすることを確認してくださいStopIteration

try: 
    curdir, dirlist, flist = next(os.walk(path2)) 
except StopIteration: 
    pass 

最後に、あなたが与えられたパスでディレクトリとファイルを取得する簡単な方法としてdirlistflistを利用しているからでない限り。その後、os.walkは不要で、代わりにos.listdirまたはos.scandirを使用できます。私はあなたが望むものを正確にあなたの質問を理解していれば

0

path2自体の内部のすべてのエントリが一覧表示されますpath2が、os.scandirのすべてのサブディレクトリ内のファイル/ディレクトリのリストを出力しos.walkではありません。ドキュメントから

例は、上記のリンク:

with os.scandir(path) as it: 
    for entry in it: 
     if not entry.name.startswith('.') and entry.is_file(): 
      print(entry.name) 
関連する問題