2017-09-07 9 views
0

私はmutagen libraryを使って簡単なスクリプトを書いています。これは、フォルダ内のオーディオファイルの量とフォルダ全体のオーディオ再生時間(サブフォルダからのオーディオファイルを含む)をカウントします。os.walk()は同じフォルダを2回訪問する

いくつかのテストの後、私のスクリプトはいくつかのフォルダを2回訪れていることがわかりました。通常、これらのディレクトリは別のサブフォルダのサブフォルダです。その結果として、それは結果のこの種を出力します。

$ python3 music_scan.py 

Library: ~/Music/ 
Amount of audio files: 3520 
Total playing time: 
Days Hours Min Sec 
9 7 30 26 

しかし、現実には、あなたが一つのフォルダにすべてのオーディオトラックを移動し、そのテスト・フォルダにスクリプトを実行する場合、それは異なる結果を示しています。確かに

$ python3 music_scan.py ~/test 
Library: ~/test/ 
Amount of audio files: 885 
Total playing time: 
Days Hours Min Sec 
2 15 49 9 

量テストフォルダ内のオーディオトラック数は885でした。私はls | wc -lコマンドでそれをチェックしました なぜos.walk()はいくつかのサブフォルダを2回訪問しますか?

+0

あなたは 'for f'ファイルと' d in dirs'を持っています。これは確かに同じファイルを訪れます。これらのループの1つは必要ありません。 – DyZ

+0

os.walk()のドキュメントでは、ディレクトリツリーを移動するとは言えませんか?だからなぜあなたは "d in dirs"のためにやっているのですか? – Mike

+0

一部のフォルダには、ファイルを含むファイルとフォルダが含まれています。私が知っている限り、 'files'にはサブフォルダからのファイルは含まれていませんが、ファイル自体にはファイル名だけが含まれています。だから私も再帰的にサブフォルダを訪問する必要がありますか?それとも私は何かを誤解していますか? – xbound

答えて

4

os.walkは、既にディレクトリツリー全体を再帰的に処理します。どちらの

def scan_lib(path): 
    ... 
    for root,dirs,files in os.walk(path,followlinks=False): 
     ... 
     for d in dirs: 
      dir_playtime,dir_audios = scan_lib(os.path.join(root,d)) 
      ... 

os.listdirの代わりos.walkを使用して再帰呼び出しを保つ、あるいは単にfor d in dirs:で始まる4行を削除します。

ただし、再帰的にあなたの方法scan_libを呼び出します。

関連する問題