Python копирование файлов по маске

Обновлено: 07.07.2024

Модуль shutil содержит набор функций высокого уровня для обработки файлов, групп файлов, и папок. В частности, доступные здесь функции позволяют копировать, перемещать и удалять файлы и папки. Часто используется вместе с модулем os.

Операции над файлами и директориями

shutil.copyfileobj(fsrc, fdst[, length]) - скопировать содержимое одного файлового объекта (fsrc) в другой (fdst). Необязательный параметр length - размер буфера при копировании (чтобы весь, возможно огромный, файл не читался целиком в память).

При этом, если позиция указателя в fsrc не 0 (т.е. до этого было сделано что-то наподобие fsrc.read(47)), то будет копироваться содержимое начиная с текущей позиции, а не с начала файла.

shutil.copyfile(src, dst, follow_symlinks=True) - копирует содержимое (но не метаданные) файла src в файл dst. Возвращает dst (т.е. куда файл был скопирован). src и dst это строки - пути к файлам. dst должен быть полным именем файла.

Если src и dst представляют собой один и тот же файл, исключение shutil.SameFileError.

Если dst существует, то он будет перезаписан.

Если follow_symlinks=False и src является ссылкой на файл, то будет создана новая символическая ссылка вместо копирования файла, на который эта символическая ссылка указывает.

shutil.copymode(src, dst, follow_symlinks=True) - копирует права доступа из src в dst. Содержимое файла, владелец, и группа не меняются.

shutil.copystat(src, dst, follow_symlinks=True) - копирует права доступа, время последнего доступа, последнего изменения, и флаги src в dst. Содержимое файла, владелец, и группа не меняются.

shutil.copy(src, dst, follow_symlinks=True) - копирует содержимое файла src в файл или папку dst. Если dst является директорией, файл будет скопирован с тем же названием, что было в src. Функция возвращает путь к местонахождению нового скопированного файла.

Если follow_symlinks=False, и src это ссылка, dst будет ссылкой.

Если follow_symlinks=True, и src это ссылка, dst будет копией файла, на который ссылается src

copy() копирует содержимое файла, и права доступа.

shutil.copy2(src, dst, follow_symlinks=True) - как copy(), но пытается копировать все метаданные.

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False) - рекурсивно копирует всё дерево директорий с корнем в src, возвращает директорию назначения.

Директория dst не должна существовать. Она будет создана, вместе с пропущенными родительскими директориями.

Права и времена у директорий копируются copystat(), файлы копируются с помощью функции copy_function (по умолчанию shutil.copy2()).

Если symlinks=True, ссылки в дереве src будут ссылками в dst, и метаданные будут скопированы настолько, насколько это возможно.

Если False (по умолчанию), будут скопированы содержимое и метаданные файлов, на которые указывали ссылки.

Если symlinks=False, если файл, на который указывает ссылка, не существует, будет добавлено исключение в список ошибок, в исключении shutil.Error в конце копирования.

Можно установить флаг ignore_dangling_symlinks=True, чтобы скрыть данную ошибку.

Если ignore не None, то это должна быть функция, принимающая в качестве аргументов имя директории, в которой сейчас copytree(), и список содержимого, возвращаемый os.listdir(). Т.к. copytree() вызывается рекурсивно, ignore вызывается 1 раз для каждой поддиректории. Она должна возвращать список объектов относительно текущего имени директории (т.е. подмножество элементов во втором аргументе). Эти объекты не будут скопированы.

shutil.ignore_patterns(*patterns) - функция, которая создаёт функцию, которая может быть использована в качестве ignore для copytree(), игнорируя файлы и директории, которые соответствуют glob-style шаблонам.

shutil.rmtree(path, ignore_errors=False, onerror=None) - Удаляет текущую директорию и все поддиректории; path должен указывать на директорию, а не на символическую ссылку.

Если ignore_errors=True, то ошибки, возникающие в результате неудавшегося удаления, будут проигнорированы. Если False (по умолчанию), эти ошибки будут передаваться обработчику onerror, или, если его нет, то исключение.

На ОС, которые поддерживают функции на основе файловых дескрипторов, по умолчанию используется версия rmtree(), не уязвимая к атакам на символические ссылки.

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

Чтобы проверить, уязвима ли система к подобным атакам, можно использовать атрибут rmtree.avoids_symlink_attacks.

Если задан onerror, это должна быть функция с 3 параметрами: function, path, excinfo.

Первый параметр, function, это функция, которая создала исключение; она зависит от платформы и интерпретатора. Второй параметр, path, это путь, передаваемый функции. Третий параметр, excinfo - это информация об исключении, возвращаемая sys.exc_info(). Исключения, вызванные onerror, не обрабатываются.

shutil.move(src, dst, copy_function=copy2) - рекурсивно перемещает файл или директорию (src) в другое место (dst), и возвращает место назначения.

Если dst - существующая директория, то src перемещается внутрь директории. Если dst существует, но не директория, то оно может быть перезаписано.

shutil.disk_usage(path) - возвращает статистику использования дискового пространства как namedtuple с атрибутами total, used и free, в байтах.

shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None) - возвращает путь к исполняемому файлу по заданной команде. Если нет соответствия ни с одним файлом, то None. mode это права доступа, требующиеся от файла, по умолчанию ищет только исполняемые.

Архивация

Высокоуровневые функции для созданиия и чтения архивированных и сжатых файлов. Основаны на функциях из модулей zipfile и tarfile.

shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) - создаёт архив и возвращает его имя.

base_name это имя файла для создания, включая путь, но не включая расширения (не нужно писать ".zip" и т.д.).

format - формат архива.

root_dir - директория (относительно текущей), которую мы архивируем.

base_dir - директория, в которую будет архивироваться (т.е. все файлы в архиве будут в данной папке).

Если dry_run=True, архив не будет создан, но операции, которые должны были быть выполнены, запишутся в logger.

owner и group используются при создании tar-архива.

shutil.get_archive_formats() - список доступных форматов для архивирования.

shutil.unpack_archive(filename[, extract_dir[, format]]) - распаковывает архив. filename - полный путь к архиву.

extract_dir - то, куда будет извлекаться содержимое (по умолчанию в текущую).

format - формат архива (по умолчанию пытается угадать по расширению файла).

shutil.get_unpack_formats() - список доступных форматов для разархивирования.

Запрос размера терминала вывода

shutil.get_terminal_size(fallback=(columns, lines)) - возвращает размер окна терминала.

fallback вернётся, если не удалось узнать размер терминала (терминал не поддерживает такие запросы, или программа работает без терминала). По умолчанию (80, 24).


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

Эта статья предназначена как раз для начинающих разработчиков. В ней описаны 8 крайне важных команд для работы с файлами, папками и файловой системой в целом. Все примеры из этой статьи размещены в Google Colab Notebook (ссылка на ресурс — в конце статьи).

Показать текущий каталог

Самая простая и вместе с тем одна из самых важных команд для Python-разработчика. Она нужна потому, что чаще всего разработчики имеют дело с относительными путями. Но в некоторых случаях важно знать, где мы находимся.

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

Так вот, для того чтобы показать текущий каталог, нужна встроенная в Python OS-библиотека:


Ее легко запомнить, так что лучше выучить один раз, чем постоянно гуглить. Это здорово экономит время.


Имейте в виду, что я использую Google Colab, так что путь /content является абсолютным.

Проверяем, существует файл или каталог

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

Функция os.path.exists () принимает аргумент строкового типа, который может быть либо именем каталога, либо файлом.

В случае с Google Colab при каждом запуске создается папка sample_data. Давайте проверим, существует ли такой каталог. Для этого подойдет следующий код:


Эта же команда подходит и для работы с файлами:


Если папки или файла нет, команда возвращает false.


Объединение компонентов пути

В предыдущем примере я намеренно использовал слеш "/" для разделителя компонентов пути. В принципе это нормально, но не рекомендуется. Если вы хотите, чтобы ваше приложение было кроссплатформенным, такой вариант не подходит. Так, некоторые старые версии ОС Windows распознают только слеш "\" в качестве разделителя.

Но не переживайте, Python прекрасно решает эту проблему благодаря функции os.path.join (). Давайте перепишем вариант из примера в предыдущем пункте, используя эту функцию:




Создание директории

Ну а теперь самое время создать директорию с именем test_dir внутри рабочей директории. Для этого можно использовать функцию
os.mkdir():


Давайте посмотрим, как это работает на практике.


Если же мы попытаемся создать каталог, который уже существует, то получим исключение.


Именно поэтому рекомендуется всегда проверять наличие каталога с определенным названием перед созданием нового:


Еще один совет по созданию каталогов. Иногда нам нужно создать подкаталоги с уровнем вложенности 2 или более. Если мы все еще используем os.mkdir (), нам нужно будет сделать это несколько раз. В этом случае мы можем использовать os.makedirs (). Эта функция создаст все промежуточные каталоги так же, как флаг mkdir -p в системе Linux:


Вот что получается в результате.


Показываем содержимое директории

Еще одна полезная команда — os.listdir(). Она показывает все содержимое каталога.

Команда отличается от os.walk (), где последний рекурсивно показывает все, что находится «под» каталогом. os.listdir () намного проще в использовании, потому что просто возвращает список содержимого:


В некоторых случаях нужно что-то более продвинутое — например, поиск всех CSV-файлов в каталоге «sample_data». В этом случае самый простой способ — использовать встроенную библиотеку glob:


Перемещение файлов

Самое время попробовать переместить файлы из одной папки в другую. Рекомендованный способ — еще одна встроенная библиотека shutil.
Сейчас попробуем переместить все CSV-файлы из директории «sample_data» в директорию «test_dir». Ниже — пример кода для выполнения этой операции:


Кстати, есть два способа выполнить задуманное. Например, мы можем использовать библиотеку OS, если не хочется импортировать дополнительные библиотеки. Как os.rename, так и os.replace подходят для решения задачи.

Но обе они недостаточно «умные», чтобы позволить перемесить файлы в каталог.


Чтобы все это работало, нужно явно указать имя файла в месте назначения. Ниже — код, который это позволяет сделать:


Здесь функция os.path.basename () предназначена для извлечения имени файла из пути с любым количеством компонентов.

Другая функция, os.replace (), делает то же самое. Но разница в том, что os.replace () не зависит от платформы, тогда как os.rename () будет работать только в системе Unix / Linux.

Еще один минус — в том, что обе функции не поддерживают перемещение файлов из разных файловых систем, в отличие от shutil.

Поэтому я рекомендую использовать shutil.move () для перемещения файлов.

Копирование файлов

Аналогичным образом shutil подходит и для копирования файлов по уже упомянутым причинам.

Если нужно скопировать файл README.md из папки «sample_data» в папку «test_dir», поможет функция shutil.copy():



Удаление файлов и папок

Теперь пришел черед разобраться с процедурой удаления файлов и папок. Нам здесь снова поможет библиотека OS.

Когда нужно удалить файл, нужно воспользоваться командой os.remove():


Если требуется удалить каталог, на помощь приходит os.rmdir():


Однако он может удалить только пустой каталог. На приведенном выше скриншоте видим, что удалить можно лишь каталог level_3. Что если мы хотим рекурсивно удалить каталог level_1? В этом случае зовем на помощь shutil.


Функция shutil.rmtree() сделает все, что нужно:


Пользоваться ею нужно с осторожностью, поскольку она безвозвратно удаляет все содержимое каталога.

Собственно, на этом все. 8 важных операций по работе с файлами и каталогами в среде Python мы знаем. Что касается ссылки, о которой говорилось в анонсе, то вот она — это Google Colab Network с содержимым, готовым к запуску.

В этом разделе приводятся примеры использования функций модуля shutil , которые выполняют высокоуровневые файловые операции, такие как копирование, удаление и архивирование.

Содержание:

Копирование файла:

Функция shutil.copyfile() копирует содержимое источника в место назначения и вызывает исключение IOError , если у него нет разрешения на запись в файл назначения.

Функция shutil.copy() интерпретирует имя выходного файла как инструмент командной строки Unix cp . Если путь назначения указан как каталог, а не файл, то в каталоге создается новый файл с использованием его базового имени.

Рекурсивное копирование каталога:

Функция shutil.copytree() рекурсивно копирует весь каталог.

Выборочное рекурсивное копирование файлов каталога:

Пример, который использует помощник shutil.ignore_patterns() . Здесь копируется все, кроме файлов .pyc и файлов или каталогов, чье имя начинается с tmp .

Другой пример, который использует аргумент ignore для добавления вызова логирования копирования файлов:

Рекурсивное удаление каталога:

Работа функции shutil.rmtree() , которая выполняет рекурсивное удаление каталога, демонстрировалась выше. Разберем ситуации посложнее.

В этом примере показано, как удалить дерево каталогов в Windows, где для некоторых файлов установлен бит только для чтения. Он использует обратный вызов onerror , чтобы очистить бит readonly и повторить попытку удаления.

В функции shutil.rmtree() , так же можно использовать помощник shutil.ignore_patterns() для выборочного рекурсивного удаления файлов как это делается в выборочном рекурсивном копировании файлов.

Пример реализации функции shutil.copytree() :

Этот пример является реализацией функции shutil.copytree() , с опущенной строкой документации. Он демонстрирует многие другие функции, предоставляемые этим модулем.

Архивирование каталогов:

В этом примере создадим архив tar-файлов с использованием gzip , содержащий все файлы, найденные в каталоге .ssh пользователя:

Эй! В этом уроке мы узнаем о функциях, присутствующих в модуле shutil Python. Итак, давайте начнем.

Эй! В этом уроке мы узнаем о функциях, присутствующих в модуле shutil Python. Итак, давайте начнем.

Модуль shutil Python предоставляет нам ряд высокоуровневых операций с файлами. Мы можем копировать и удалять файлы и каталоги. Давайте начнем с модуля и подробно изучим практическую реализацию каждого из файлов.

Как скопировать файлы с помощью модуля shutil?

В модуле shutil доступны различные методы копирования содержимого одного файла в другой файл.

1. shutil.copyfileobj(src,dst)

Предположим, мы хотим скопировать содержимое файла data.txt кому data1.txt , мы можем использовать следующий фрагмент кода:

2. shutil.copy(src,dst)

Другой способ копирования данных из одного файла в другой может быть без создания объекта file. Здесь мы передаем относительный путь к нашим файлам.

3. shutil.copy2(src,dst)

функции copy (src,dst) и copy2(src,dst) почти одинаковы, но copy2(src,dst) также копирует метаданные исходного файла.

Метаданные включают информацию о том, когда файл был создан, доступен или изменен.

4. shutil.copyfile(src,dst)

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

5. shutil.move(src,dst)

Предположим, мы хотим удалить файл из одного места и переместить его в другое место. Вот, давайте двигаться shutil.py из источника в другое место:

6. shutil.copytree(src,dst)

Если мы хотим скопировать полную папку, содержащую все ее файлы, в новое место, мы можем использовать функцию copytree(src,dst ).

Он рекурсивно копирует все дерево каталогов с корнем в src в каталог с именем dst и возвращает каталог назначения.

Давайте скопируем папку Python в папку Новая папка .

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

Итак, здесь мы создали папку python 1 внутри папки Новая папка .

Как удалить/удалить файлы с помощью модуля shutil?

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

Используя shutil.rmtree() , мы можем удалить любую папку,файл или каталог. Давайте удалим папку Python .

Как скопировать биты разрешений из одного файла в другой?

Копирование файла-это одна часть. Что делать, если вы просто хотите скопировать те же разрешения файла во все другие файлы? Давайте научимся делать именно это, используя модуль shutil здесь.

1. shutil.copymode(src,dst)

Этот метод копирует биты разрешений из src в dst. Давайте скопируем биты разрешений из каталога Python в каталог Python 1 .

2. shutil.copystat(src,dst)

shutil.copystat(src.dst) копирует биты разрешений вместе с метаданными.

Другие функции в модуле shutil

Теперь давайте рассмотрим различные функции модуля shutil.

1. shutil.disk_usage(путь)

функция shutil.disk_usage(path) возвращает статистику использования диска по заданным именам путей в виде кортежа с атрибутами total , который представляет собой общий объем памяти, used , который является используемым пространством и free , который является свободным пространством в байтах.

2. шутил.который()

шутил.функция which() возвращает путь к исполняемому приложению, которое запустилось бы, если бы была вызвана данная команда cmd.

Вывод

В этом уроке мы рассмотрели, как мы можем копировать, удалять и работать с другими операциями над файлами и папками с помощью модуля shutil в python. Надеюсь, вам всем понравилось. Оставайтесь с нами!

Читайте также: