2011-12-24 4 views
5

GNU/Linuxシステム上のPythonでは、すべての.MOVまたは.AVIのファイルを再帰的にスキャンして格納するための最も速い方法は何でしょうかリストに?特定の拡張子を持つディレクトリにファイルリストを作成する最速の方法

+1

Fastestには、ネイティブコードを使用するための拡張機能が含まれている可能性があります。しかし、本当にそれが欲しいですか? –

+0

あなたがそれをしたくない場合でも、私たちが話しているファイルとディレクトリの数によっては、 'os.walk()'の結果を処理するよりも、 'find'コマンドを実行する方が速いかもしれません。しかし、 'os.walk()'の解決策が十分に速ければ、もっとエレガントで理解しやすくなります。 –

答えて

3

現在のディレクトリにあるファイルのリストの例。特定のパスに対してこれを展開することができます。

import glob 
movlist = glob.glob('*.mov') 
7

あなたは、ファイルの整合のためにrecuresive歩くとglob.glob()またはfnmatch.filter()のために)(os.walk使用することができます。

チェックこれはanswer

6

私はOSを使用したいです.walkディレクトリをスキャンして、os.path.splitextに接尾辞をつけて自分でフィルタリングします。

suffixes = set(['.AVI', '.MOV']) 
for dirpath, dirnames, filenames in os.walk('.'): 
    for f in filenames: 
     if os.path.splitext(f)[1] in suffixes: 
      yield os.path.join(dirpath, f) 
+0

大文字と小文字を区別しないマッチングを適用するのに簡単に適応できるので、おそらくこれが最適な解決策です。 – ekhumoro

2
pattern = re.compile('.*\.(mov|MOV|avi|mpg)$') 

def fileList(source): 
    matches = [] 
    for root, dirnames, filenames in os.walk(source): 
     for filename in filter(lambda name:pattern.match(name),filenames): 
      matches.append(os.path.join(root, filename)) 
    return matches 
+0

[fnmatch](http://docs.python.org/library/fnmatch.html#module-fnmatch)モジュールでは、非常に単純なグロブパターンしかサポートされないため、フィルタは機能しません。 – ekhumoro

+0

@ekhumoroもし動作すれば、シンボル([]、?、?、*、())はglob、pythonのテストコードに許可され、どの作品を参照してください – Jhonathan

+0

あなたのパターンは '* [movMOVaipg()]'と等価です。これは、例えば '* .i'、' * .a'、 '* .M'などと一致しますが、_not_' * .MOV'​​、 '* .avi'などと一致します。 – ekhumoro

1

のPython 2.xの:

import os 

def generic_tree_matching(rootdirname, filterfun): 
    return [ 
     os.path.join(dirname, filename) 
     for dirname, dirnames, filenames in os.walk(rootdirname) 
     for filename in filenames 
     if filterfun(filename)] 

def matching_ext(rootdirname, extensions): 
    "Case sensitive extension matching" 
    return generic_tree_matching(
     rootdirname, 
     lambda fn: fn.endswith(extensions)) 

def matching_ext_ci(rootdirname, extensions): 
    "Case insensitive extension matching" 
    try: 
     extensions= extensions.lower() 
    except AttributeError: # assume it's a sequence of extensions 
     extensions= tuple(
      extension.lower() 
      for extension in extensions) 
    return generic_tree_matching(
     rootdirname, 
     lambda fn: fn.lower().endswith(extensions)) 

引数を指定してルートフォルダと拡張子または拡張子のタプルmatching_extmatching_ext_ciのいずれかを使用します。

>>> matching_ext(".", (".mov", ".avi")) 
1

を私は提案しますos.walkと慎重にreading of its documentationの使用。

[f for root,dirs,files in os.walk('/your/path') for f in files if is_video(f)] 

is_videoであなたの拡張子を確認:

これは、1つのライナーアプローチかもしれません。

関連する問題