2009-07-24 8 views
20

私はos.walkからリストを持っています。しかし、いくつかのディレクトリやファイルを除外したい。私はディレクトリでそれを行う方法を知っています:os.walkから(既知のタイプの)ファイルをフィルタリングする方法は?

for root, dirs, files in os.walk('C:/My_files/test'): 
    if "Update" in dirs: 
     dirs.remove("Update") 

しかし、どのように私が知っているファイルでそれを行うことができます。これが動作しないので:

もちろん
def exclude_ext(ext): 
    def compare(fn): return os.path.splitext(fn)[1] != ext 
    return compare 

files = filter(exclude_ext(".dat"), files) 

、exclude_extはあなたの適切なユーティリティパッケージに行く:

if "*.dat" in files: 
    files.remove("*.dat") 

答えて

2
files = [file for file in files if os.path.splitext(file)[1] != '.dat'] 
3

、それを書くの簡潔な方法を、あなたは、この多くを行う場合。

26
files = [ fi for fi in files if not fi.endswith(".dat") ] 
0

はあなたが必要とする正確に何であるべき:これは、ラムダ関数を生成するジェネレータ式で

import os 

skippingWalk = lambda targetDirectory, excludedExtentions: (
    (root, dirs, [F for F in files if os.path.splitext(F)[1] not in excludedExtentions]) 
    for (root, dirs, files) in os.walk(targetDirectory) 
) 

for line in skippingWalk("C:/My_files/test", [".dat"]): 
    print line 

if thisFile.endswith(".txt"): 
+0

このような回答は既に提供されています。 – SilentGhost

+0

次の行で何をしようとしているのかがはっきりしないことはあまり言及していません。 – SilentGhost

2

はこれを試してみてください。パスといくつかの拡張機能を渡し、パスを使ってos.walkを呼び出し、リスト内包を使って不要な拡張機能のリスト内の拡張子を持つファイルをフィルタリングし、結果を返します。

(編集:別の例拡張子の間の実際の差があるかもしれないので、.upper()文を削除 - あなたは、これは、大文字と小文字を区別することos.path.splitext(F)[1].upper()を追加し、大文字でで拡張子を渡したい場合)

4

そして、私はちょうどこれを書いたし、この問題につまずいたので、もう一つの方法で:

files = filter(lambda file: not file.endswith('.txt'), files)

13

は、複数の拡張子を除外します。

files = [ file for file in files if not file.endswith(('.dat','.tar')) ] 
2

別の解決策は、fnmatchモジュールから関数を使用することです:

def MatchesExtensions(name,extensions=["*.dat", "*.txt", "*.whatever"]): 
    for pattern in extensions: 
    if fnmatch.fnmatch(pattern): 
     return True 
    return False 

あなたは大文字/小文字の拡張子を持つすべての面倒を避けるこの方法です。これは、* .JPEG、* .jpeg、* .JPeg、* .Jpegと一致させる必要がある場合、下限/上限に変換する必要がないことを意味します。

0

既知のタイプのファイルを無視する最も簡単な方法は、パスとすべてのファイルを取得し、 "if"あなたが望んでいない必要な終了を持つフィルタの後に。

for files in os.walk(path): 

    if files.endswith('.type'): 

     ..... 
     ..... 
関連する問題