Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
А это подборки моих материалов на канале
Приложение 2 один к видеоуроку (см. Приложение 1)
Библиотека shutil
Продолжаем рассказывать о библиотеке shutil.
Групповая обработка файлов в shutil
Сегодня поговорим о функциях, выполняющих групповые операции.
- copytree() — осуществляет копирование дерева каталогов. Прототип функции
shutil.copytree(src, dst, symlinks=False, ignore=None,
copy_function=copy2, ignore_dangling_symlinks=False,
dirs_exist_ok=False), где
src - путь к корню копируемого дерева;
dst - путь, куда копируем дерево;
symlink - если True, то копируется сама символическая ссылка, если False, то копируется объект, на который указывает символическая ссылка. Если False и объекта, на которую указывает ссылка не существует, то бросается исключение;
ignore - может указывать на функцию ignore_patterns, указывающую, какие файлы следует пропускать;
copy_function - указывает на функцию копирования файла. По умолчанию это copy2(). Но можно написать и свою собственную функцию;
ignore_dangling_symlinks - если True, то отключается исключения в случае, если объекта, на который указывает символическая ссылка нет;
dirs_exist_ok - если True, то не вызывается исключения, когда dst не существует. - move() — перемещает файл или дерево каталогов. Прототип функции
move(src, dst, copy_function=copy2), где
src - путь к каталогу или файлу, который следует переместить.
dst - путь, куда перемещать.
copy_function - функция, которая будет копировать файл. По умолчанию это copy2(), но можно указать и свою. - rmtree() — удаляет дерево каталогов. Прототип функции
rmtree(path, ignore_errors=False, onerror=None, *, dir_fd=None), где
path - каталога, который следует удалить, вместе с подкаталогами;
ignore_errors - если True, то ошибки, возникшие при удалении, игнорируются;
onerro - можно указать обработчик ошибок, возникших при удалении;
dir_fd - не обязательный дескриптор каталога. - make_archive() — создаёт архив указанного формата. Прототип функции
make_archive(base_name, format[,
root_dir[, base_dir[, verbose[,
dry_run[, owner[, group[, logger]]]]]]])
base_name - имя файла-архива, включая его путь;
format - строка-формат архива;
root_dir - корневой каталог архива;
base_dir - путь к каталогу, откуда начинается архивирование;
verbose - параметр не используется;
dry_run - если значение True, то архив не создаётся, но делается запись в журнал;
owner - владелец создаваемого архива;
group - группа создаваемого архива;
logger - экземпляр объекта logging.Logger (журналирование). - unpack_archive() — распаковка архива. Прототип
unpack_archive(filename[, extract_dir[, format]]), где
filename - имя архива;
extract_dir - куда распаковываем;
format - формат архива.
Есть еще несколько функций, касающихся архивирования. Я не буду подробно на них останавливаться, но лишь перечислю
- get_archive_formats() — получить список кортежей описывающих поддерживаемые форматы архивирования.
- get_unpack_formats() — аналогично список распаковщиков.
- register_archive_format() — регистрация нового формата архиватора.
- register_unpack_format() — регистрация нового формата распаковщика.
Примеры использования shutil
shutil отличная высокоуровневая библиотека для работы с деревьями каталогов. Конечно, я как представитель старой школы, предпочёл бы сам написать подобную библиотеку, но не всегда же у вас будет время на это.
Создание архивов
#!/usr/bin/python3
import shutil
# создание zip-архива каталога
pt_from = input()
pt_to = input()
shutil.make_archive(pt_to, 'zip', pt_from)
Программа спрашивает каталог, который подлежит архивированию, имя архива, который можно указать с полным путём к нему. Например, вводим
/home/vladislav/shutil
./arh
Получаем в текущем каталоге файл-архив arh.zip.
Копирование с журналированием
Программа выводит на стандартное устройства информацию, какие каталоги она копирует
Использование logging, конечно не обязательно, тем более, что этот класс я еще не представлял на канале, а можно просто
print(f'Working in {path}')
Ну наверное и всё с shutil, но в одном из ближайших статей представлю рекурсивную функцию копирования дерева каталогов.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.