2009-07-24 2 views
20

У меня есть список из os.walk. Но я хочу исключить некоторые каталоги и файлы. Я знаю, как это сделать с каталогами:Как фильтровать файлы (с известным типом) из os.walk?

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

Но как я могу это сделать с файлами, тип которых я знаю. потому что это не работает:

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

ответ

3

А краткий способ писать, если вы сделаете это много:

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

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

Конечно, exclude_ext идет в вашем соответствующих утилитах пакета.

0

Должен быть именно то, что вам нужно:

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

нет, такой ответ уже предоставлен. – SilentGhost

+0

не слишком упоминает, что не ясно, что вы собираетесь делать на следующей строке. – SilentGhost

2

Попробуйте это:

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 

Это выражение генератора производящего функцию лямбды. Вы передаете ему путь и некоторые расширения, и он вызывает os.walk с этим путем, отфильтровывает файлы с расширениями в списке нежелательных расширений, используя понимание списка, и возвращает результат.

(редактирование:. Извлекал .upper() заявление, потому что может быть фактическая разница между расширениями различных случае - если вы хотите, чтобы это было чувствительно к регистру, добавьте .upper() после os.path.splitext(F)[1] и передать удлинители заглавными буквами)

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'): 

     ..... 
     ..... 
Смежные вопросы