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.