2015-08-11 5 views
5

Ich versuche, einen Ordner und alle Unterordner durchlaufen, um alle Dateien bestimmter Dateitypen zu finden - zum Beispiel nur. Mp4, .avi, .wmv.Python - Loop-Dateien von bestimmten Erweiterungen

Hier ist, was ich habe jetzt, Schleifen es durch alle Dateitypen:

import os 
rootdir = 'input' 

for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
      print (os.path.join(subdir, file)) 

Dank!

Antwort

6

können Sie os.path.splitext verwenden, die einen Weg nimmt und teilt die Dateierweiterung vom Ende davon:

import os 
rootdir = 'input' 
extensions = ('.mp4', '.avi', '.wmv') 

for subdir, dirs, files in os.walk(rootdir): 
    for file in files: 
     ext = os.path.splitext(file)[-1].lower() 
     if ext in extensions: 
      print (os.path.join(subdir, file)) 
+0

Dank ozgur, dieser Code ist am ehesten zu dem, was ich ursprünglich hatte - leicht zu verstehen. Die anderen Antworten könnten effizienter sein, wenn sie im großen Maßstab durchgeführt werden (nicht getestet!), Aber für meine einfachen Aufgaben wird dies vollkommen ausreichen. – pufAmuf

13

Für mehrere Erweiterungen, ist die einfachste nur str.endswith zu verwenden, um ein Tupel von Teil vorbei zu überprüfen:

for file in files: 
     if file.endswith((".avi",".mp4","wmv")): 
     print (os.path.join(subdir, file)) 

Sie iglob wie unten und Kette, welche die Suche zurückgegeben oder re.search verwenden verwenden können, aber mit endswith ist wahrscheinlich der beste Ansatz.

from itertools import chain 
from glob import iglob 

for subdir, dirs, files in os.walk(rootdir): 
    for file in chain.from_iterable(iglob(os.path.join(rootdir,p)) for p in ("*.avi", "*.mp4", "*wmv")) : 
      print(os.path.join(subdir, file)) 

Mit python3.5glob unterstützt nun rekursive Suche mit dem ** Syntax:

from itertools import chain 
from glob import iglob 

from glob import iglob 
for file in chain.from_iterable(iglob(os.path.join(rootdir,p)) 
     for p in (rootdir+"**/*.avi", "**/*.mp4", "**/*wmv")): 
      print(file) 
+0

Danke für die ausführliche Erklärung Padraic, sehr interessant, wie Sie in so viele verschiedene Möglichkeiten, eine Sache zu tun in Python. – pufAmuf

+0

Kein Problem, gern geschehen. –

+1

Pass im Tupel +1 –

3

ich etwas ähnliches, dies zu ein paar Tagen und hier tat tatsächlich ist, wie ich es tat:

EXTENSIONS = ('.cpp','.hpp') 

for root, dirs, files in os.walk(top): 
    for file in files: 
     if file.endswith(EXTENSIONS): 
      #file which ends with extension type so do your thing! 

Hoffe, das ist, was Sie wollen. Sie können das ganze Skript hier auf meinem github sehen.

+0

Danke Sam, Ihre Hilfe wird sehr geschätzt! – pufAmuf

Verwandte Themen