Python shutil.ignore_patterns ошибка

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

import shutil
import errno

def copy(src, dest):
    try:
        shutil.copytree(src, dest, ignore=shutil.ignore_patterns('*.mp4', '*.bak'))
    except OSError:
        if OSError.errno == errno.ENOTDIR:
            shutil.copy(src, dest)
        else:
             print("Directory not copied. Error: %s" % OSError)

src = raw_input("Please enter a source: ")
dest = raw_input("Please enter a destination: ")

copy(src, dest)

Я получаю ошибку:

Traceback (most recent call last):   
File "/Users/XXX/PycharmProjects/Folders/Fold.py", line 29,
  in <module>
  copy(src, dest)   
File "/Users/XXX/PycharmProjects/Folders/Fold.py", line 17,
  in copy
  ignore_pat = shutil.ignore_patterns('*.mp4', '*.bak') 
AttributeError: 'module' object has no attribute 'ignore_patterns'

1 ответ

Решение

Ваша версия Python слишком старая. От shutil.ignore_patterns() документация:

Новое в версии 2.6.

Скопировать метод на более старых версиях Python достаточно просто:

import fnmatch 

def ignore_patterns(*patterns):
    """Function that can be used as copytree() ignore parameter.

    Patterns is a sequence of glob-style patterns
    that are used to exclude files"""
    def _ignore_patterns(path, names):
        ignored_names = []
        for pattern in patterns:
            ignored_names.extend(fnmatch.filter(names, pattern))
        return set(ignored_names)
    return _ignore_patterns

Это будет работать на Python 2.4 и новее.

Чтобы упростить это до вашего конкретного кода:

def copy(src, dest):
    def ignore(path, names):
        ignored = set()
        for name in names:
            if name.endswith('.mp4') or name.endswith('.bak'):
                ignored.add(name)
        return ignored

    try:
        shutil.copytree(src, dest, ignore=ignore)
    except OSError:
        if OSError.errno == errno.ENOTDIR:
            shutil.copy(src, dest)
        else:
             print("Directory not copied. Error: %s" % OSError)

Это не использовать fnmatch вообще больше (поскольку вы тестируете только определенные расширения) и используете синтаксис, совместимый со старыми версиями Python.

Другие вопросы по тегам