shutil — Высокоуровневые операции с файлами
Исходный код: Lib/shutil.py
Модуль shutil предоставляет ряд высокоуровневых операций с файлами и коллекциями файлов. В частности, предоставляются функции, поддерживающие копирование и удаление файлов. Для операций с отдельными файлами см. также модуль os.
Предупреждение
Даже высокоуровневые функции копирования файлов (shutil.copy(), shutil.copy2()) не могут скопировать всю метаданные файла.
В платформах POSIX это означает, что владелец и группа файла, а также ACL теряются. В Mac OS ресурсный вилка и другие метаданные не используются. Это означает, что ресурсы будут потеряны, а коды типа и создателя файла не будут корректными. В Windows владельцы файлов, ACL и альтернативные потоки данных не копируются.
1. Операции с каталогами и файлами
-
shutil.copyfileobj(fsrc, fdst[, length]) -
Копирует содержимое объекта fsrc типа «подобный файлу» в объект fdst типа «подобный файлу». Целое число length, если задано, — размер буфера. В частности, отрицательное значение length означает копирование данных без циклирования по данным источника частями; по умолчанию данные читаются частями, чтобы избежать неконтролируемого потребления памяти. Обратите внимание, что если текущая позиция файла объекта fsrc не 0, будут скопированы только данные от текущей позиции файла до конца файла.
-
shutil.copyfile(src, dst, *, follow_symlinks=True) -
Копирует содержимое (без метаданных) файла с именем src в файл с именем dst и возвращает dst. src и dst — имена путей, заданные в виде строк. dst должен быть полным именем целевого файла; см.
shutil.copy()для копирования в целевой каталог. Если src и dst указывают на один и тот же файл, будет поднято исключениеSameFileError.Целевой путь должен быть доступен для записи; в противном случае будет поднято исключение
OSError. Если dst уже существует, он будет перезаписан. Специальные файлы, такие как символьные или блочные устройства и каналы, не могут быть скопированы с помощью этой функции.Если follow_symlinks ложно, а src — символическая ссылка, будет создана новая символическая ссылка вместо копирования файла, на который указывает src.
Изменено в версии 3.3:
IOErrorранее использовался вместоOSError. Добавлен аргумент follow_symlinks. Теперь возвращает dst.Изменено в версии 3.4: Поднимается исключение
SameFileErrorвместоError. Поскольку первое является подклассом второго, это изменение совместимо с более ранними версиями.
-
exception shutil.SameFileError -
Это исключение возникает, если источник и место назначения в
copyfile()представляют собой один и тот же файл.Добавлена в версии 3.4.
-
shutil.copymode(src, dst, *, follow_symlinks=True) -
Копирует биты разрешений из src в dst. Содержимое файла, владелец и группа не затрагиваются. src и dst — имена путей, заданные в виде строк. Если follow_symlinks ложно, и оба src и dst — символические ссылки,
copymode()попытается изменить режим самого dst (а не файла, на который он указывает). Эта функциональность недоступна на всех платформах; см.copystat()для получения дополнительной информации. Еслиcopymode()не может изменить символические ссылки на локальной платформе, и от него требуется это сделать, он ничего не делает и возвращает.Изменено в версии 3.3: Добавлен аргумент follow_symlinks.
-
shutil.copystat(src, dst, *, follow_symlinks=True) -
Копирует биты разрешений, время последнего доступа, время последней модификации и флаги из src в dst. В Linux,
copystat()также копирует «расширенные атрибуты», где это возможно. Содержимое файла, владелец и группа не затрагиваются. src и dst — имена путей, заданные в виде строк.Если follow_symlinks ложно, и src и dst оба ссылаются на символические ссылки,
copystat()будет работать с самими символическими ссылками, а не с файлами, на которые они ссылаются — считывая информацию из символической ссылки src и записывая информацию в символическую ссылку dst.Примечание
Не все платформы предоставляют возможность проверки и изменения символических ссылок. Сам Python может сообщить вам, какая функциональность доступна локально.
- Если
os.chmod in os.supports_follow_symlinksравноTrue,copystat()может изменить биты разрешений символической ссылки. - Если
os.utime in os.supports_follow_symlinksравноTrue,copystat()может изменить время последнего доступа и модификации символической ссылки. - Если
os.chflags in os.supports_follow_symlinksравноTrue,copystat()может изменить флаги символической ссылки. (os.chflagsнедоступен на всех платформах.)
На платформах, где часть или вся эта функциональность недоступна, при запросе изменения символической ссылки
copystat()скопирует всё, что сможет.copystat()никогда не возвращает ошибку.См.
os.supports_follow_symlinksдля получения дополнительной информации.Изменено в версии 3.3: Добавлен аргумент follow_symlinks и поддержка расширенных атрибутов Linux.
- Если
-
shutil.copy(src, dst, *, follow_symlinks=True) -
Копирует файл src в файл или каталог dst. src и dst должны быть строками. Если dst указывает на каталог, файл будет скопирован в dst с использованием базового имени файла из src. Возвращает путь к новосозданному файлу.
Если follow_symlinks ложно, а src — символическая ссылка, dst будет создан как символическая ссылка. Если follow_symlinks истинно и src — символическая ссылка, dst будет копией файла, на который указывает src.
copy()копирует данные файла и режим разрешений файла (см.os.chmod()). Другие метаданные, такие как время создания и модификации файла, не сохраняются. Для сохранения всех метаданных исходного файла используйтеcopy2().Изменено в версии 3.3: Добавлен аргумент follow_symlinks. Теперь возвращает путь к новосозданному файлу.
-
shutil.copy2(src, dst, *, follow_symlinks=True) -
Идентично
copy(), за исключением того, чтоcopy2()также пытается сохранить все метаданные файла.Когда follow_symlinks ложно, а src — символическая ссылка,
copy2()пытается скопировать все метаданные из символической ссылки src в новую символическую ссылку dst. Однако эта функциональность недоступна на всех платформах. На платформах, где часть или вся эта функциональность недоступна,copy2()сохранит все доступные метаданные;copy2()никогда не возвращает ошибку.copy2()используетcopystat()для копирования метаданных файла. См.copystat()для получения дополнительной информации о поддержке платформы изменения метаданных символических ссылок.Изменено в версии 3.3: Добавлен аргумент follow_symlinks, попытка скопировать расширенные атрибуты файловой системы (сейчас только Linux). Теперь возвращает путь к новосозданному файлу.
-
shutil.ignore_patterns(*patterns) -
Эта функция-фабрика создает функцию, которая может использоваться в качестве вызываемого объекта для аргумента ignore
copytree(), игнорируя файлы и каталоги, соответствующие одному из предоставленных шаблонов patterns в стиле glob. См. пример ниже.
-
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False) -
Рекурсивно копирует всю древовидную структуру каталога, укоренённую в src, возвращая целевой каталог. Целевой каталог, именованный dst, не должен уже существовать; он будет создан, а также отсутствующие родительские каталоги. Разрешения и временные метки каталогов копируются с помощью
copystat(), отдельные файлы копируются с помощьюshutil.copy2().Если symlinks равно true, символические ссылки в исходном дереве представляются как символические ссылки в новом дереве, и метаданные исходных ссылок будут скопированы, насколько это позволяет платформа; если false или опущено, содержимое и метаданные связанных файлов копируются в новое дерево.
Когда symlinks равно false, если файл, на который указывает символическая ссылка, не существует, исключение будет добавлено в список ошибок, поднятых исключением
Errorв конце процесса копирования. Вы можете установить необязательный флаг ignore_dangling_symlinks в значение true, если хотите подавить это исключение. Обратите внимание, что этот параметр не имеет эффекта на платформах, которые не поддерживаютos.symlink().Если указан параметр ignore, он должен быть вызываемым объектом, который будет получать в качестве аргументов каталог, посещаемый функцией
copytree(), и список его содержимого, как возвращается функциейos.listdir(). Так какcopytree()вызывается рекурсивно, вызываемый объект ignore будет вызываться один раз для каждого каталога, который копируется. Вызываемый объект должен возвращать последовательность имён каталогов и файлов относительно текущего каталога (то есть подмножество элементов во втором аргументе); эти имена будут игнорироваться в процессе копирования.ignore_patterns()может быть использован для создания такого вызываемого объекта, который игнорирует имена на основе шаблонов в стиле glob.Если возникнут исключения, будет поднято исключение
Errorсо списком причин.Если указана функция copy_function, она должна быть вызываемым объектом, который будет использоваться для копирования каждого файла. Она будет вызываться с путями источника и назначения в качестве аргументов. По умолчанию используется
shutil.copy2(), но может быть использована любая функция, поддерживающая ту же сигнатуру (например,shutil.copy()).Изменено в версии 3.3: Копирование метаданных, когда symlinks равно false. Теперь возвращает dst.
Изменено в версии 3.2: Добавлен аргумент copy_function для возможности предоставления пользовательской функции копирования. Добавлен аргумент ignore_dangling_symlinks для подавления ошибок висячих символьных ссылок, когда symlinks равно false.
-
shutil.rmtree(path, ignore_errors=False, onerror=None) -
Удаляет всю древовидную структуру каталога; path должен указывать на каталог (но не на символическую ссылку на каталог). Если ignore_errors равно true, ошибки, возникшие из-за неудаленных удалений, будут игнорироваться; если false или опущено, такие ошибки обрабатываются вызовом обработчика, указанного параметром onerror или, если он опущен, они вызывают исключение.
Примечание
На платформах, которые поддерживают необходимые функции на основе fd, по умолчанию используется версия
rmtree(), устойчивая к атакам с помощью символических ссылок. На других платформах реализацияrmtree()уязвима для атак с помощью символических ссылок: при соответствующей синхронизации и условиях злоумышленники могут манипулировать символическими ссылками в файловой системе, чтобы удалить файлы, к которым у них не было бы доступа в противном случае. Приложения могут использовать атрибут функцииrmtree.avoids_symlink_attacksдля определения, какой случай применим.Если указан параметр onerror, он должен быть вызываемым объектом, который принимает три параметра: function, path и excinfo.
Первый параметр, function, — это функция, которая подняла исключение; он зависит от платформы и реализации. Второй параметр, path, будет именем пути, переданным функции function. Третий параметр, excinfo, будет информацией об исключении, возвращенной функцией
sys.exc_info(). Исключения, поднятые параметром onerror, не будут перехвачены.Изменено в версии 3.3: Добавлена устойчивая к атакам с использованием символических ссылок версия, которая автоматически используется, если платформа поддерживает функции доступа к каталогам на основе fd.
-
rmtree.avoids_symlink_attacks -
Указывает, предоставляет ли текущая платформа и реализация устойчивую к атакам с помощью символических ссылок версию
rmtree(). В настоящее время это верно только для платформ, поддерживающих функции доступа к каталогам на основе fd.Добавлен в версии 3.3.
-
-
shutil.move(src, dst, copy_function=copy2) -
Рекурсивно перемещает файл или каталог (src) в другое место (dst) и возвращает место назначения.
Если место назначения — это существующий каталог, то src перемещается внутри этого каталога. Если место назначения уже существует, но не является каталогом, оно может быть перезаписано в зависимости от семантики
os.rename().Если место назначения находится в текущей файловой системе, используется
os.rename(). В противном случае src копируется в dst с помощью copy_function, а затем удаляется. В случае с символическими ссылками будет создана новая символическая ссылка, указывающая на цель src в или как dst, и src будет удален.Если указана функция copy_function, она должна быть вызываемым объектом, принимающим два аргумента src и dst, и будет использоваться для копирования src в dest, если
os.rename()не может быть использована. Если источник — каталог, вызываетсяcopytree(), передавая ейcopy_function(). По умолчанию copy_function — этоcopy2(). Использованиеcopy()в качестве copy_function позволяет перемещению успешно завершиться, когда копирование метаданных невозможно, но при этом не копируются никакие метаданные.Изменено в версии 3.3: Добавлена явная обработка символических ссылок для внешних файловых систем, тем самым адаптируя её к поведению GNU's mv. Теперь возвращает dst.
Изменено в версии 3.5: Добавлен ключевой аргумент copy_function.
-
shutil.disk_usage(path) -
Возвращает статистику использования диска по заданному пути в виде именованной кортежи с атрибутами total, used и free, которые представляют собой объём общего, используемого и свободного места в байтах.
Добавлен в версии 3.3.
Доступность: Unix, Windows.
-
shutil.chown(path, user=None, group=None) -
Изменяет владельца user и/или группу group заданного path.
user может быть именем системного пользователя или uid; то же самое относится к group. Требуется хотя бы один аргумент.
См. также
os.chown(), функцию-аналог.Доступность: Unix.
Добавлен в версии 3.3.
-
shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None) -
Возвращает путь к исполняемому файлу, который будет запущен, если вызвать заданный cmd. Если cmd не будет запущен, возвращает
None.mode — это маска разрешений, передаваемая в
os.access(); по умолчанию определяется, существует ли файл и является ли он исполняемым.Если параметр path не указан, используются результаты
os.environ(), возвращая либо значение «PATH», либо значения по умолчаниюos.defpath.В Windows текущий каталог всегда добавляется в начало path, независимо от того, используется ли значение по умолчанию или предоставлено своё; такое поведение используется оболочкой командной строки при поиске исполняемых файлов. Кроме того, при поиске cmd в path проверяется переменная среды
PATHEXT. Например, если вы вызываетеshutil.which("python"),which()будет искатьPATHEXTдля определения того, что нужно искатьpython.exeв каталогах path. Например, в Windows:>>> shutil.which("python") 'C:\\Python33\\python.EXE'Добавлен в версии 3.3.
-
exception shutil.Error -
Это исключение собирает исключения, возникающие во время многофайловой операции. Для
copytree()аргументом исключения является список из 3-х кортежей (srcname, dstname, exception).
1.1. пример copytree
Этот пример демонстрирует реализацию функции copytree(), описанной выше, без строки документации. Он демонстрирует многие другие функции, предоставляемые этим модулем.
def copytree(src, dst, symlinks=False):
names = os.listdir(src)
os.makedirs(dst)
errors = []
for name in names:
srcname = os.path.join(src, name)
dstname = os.path.join(dst, name)
try:
if symlinks and os.path.islink(srcname):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
copytree(srcname, dstname, symlinks)
else:
copy2(srcname, dstname)
# XXX What about devices, sockets etc.?
except OSError as why:
errors.append((srcname, dstname, str(why)))
# catch the Error from the recursive copytree so that we can
# continue with other files
except Error as err:
errors.extend(err.args[0])
try:
copystat(src, dst)
except OSError as why:
# can't copy file access times on Windows
if why.winerror is None:
errors.extend((src, dst, str(why)))
if errors:
raise Error(errors)
Еще один пример, использующий вспомогательную функцию ignore_patterns():
from shutil import copytree, ignore_patterns
copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
Это скопирует всё, кроме файлов .pyc и файлов или каталогов, имена которых начинаются с tmp.
Еще один пример, использующий аргумент ignore для добавления вызова логирования:
from shutil import copytree
import logging
def _logpath(path, names):
logging.info('Working in %s' % path)
return [] # nothing will be ignored
copytree(source, destination, ignore=_logpath)
1.2. Пример rmtree
Этот пример демонстрирует, как удалить древовидную структуру каталогов в Windows, где некоторые файлы имеют установленный бит "только для чтения". Он использует обратный вызов onerror для сброса бита "только для чтения" и повторной попытки удаления. Любая последующая неудача будет передана дальше.
import os, stat
import shutil
def remove_readonly(func, path, _):
"Clear the readonly bit and reattempt the removal"
os.chmod(path, stat.S_IWRITE)
func(path)
shutil.rmtree(directory, onerror=remove_readonly)
2. Операции архивирования
Введено в версии 3.2.
Изменено в версии 3.5: Добавлена поддержка формата xztar.
Также предоставляются высокоуровневые утилиты для создания и чтения сжатых и архивированных файлов. Они полагаются на модули zipfile и tarfile.
-
shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) -
Создает архивный файл (например, zip или tar) и возвращает его имя.
base_name — имя создаваемого файла, включая путь, без каких-либо форматно-специфичных расширений. format — формат архива: один из “zip” (если модуль
zlibдоступен), “tar”, “gztar” (если модульzlibдоступен), “bztar” (если модульbz2доступен) или “xztar” (если модульlzmaдоступен).root_dir — каталог, который будет корневым каталогом архива; например, мы обычно переходим в root_dir перед созданием архива.
base_dir — каталог, с которого мы начинаем архивирование; т.е. base_dir будет общим префиксом всех файлов и каталогов в архиве.
root_dir и base_dir по умолчанию равны текущему каталогу.
Если dry_run равно true, архив не создается, но операции, которые должны были быть выполнены, записываются в logger.
owner и group используются при создании tar-архива. По умолчанию используются текущий владелец и группа.
logger должен быть объектом, совместимым с **PEP 282**, обычно экземпляром
logging.Logger.Аргумент verbose не используется и устарел.
-
shutil.get_archive_formats() -
Возвращает список поддерживаемых форматов архивирования. Каждый элемент возвращаемой последовательности — это кортеж
(name, description).По умолчанию модуль
shutilпредоставляет следующие форматы:-
zip: ZIP-файл (если модуль
zlibдоступен). - tar: нескомпрессированный tar-файл.
-
gztar: сжатый tar-файл (gzip) (если модуль
zlibдоступен). -
bztar: сжатый tar-файл (bzip2) (если модуль
bz2доступен). -
xztar: сжатый tar-файл (xz) (если модуль
lzmaдоступен).
Вы можете регистрировать новые форматы или предоставлять собственный архиватор для любых существующих форматов, используя
register_archive_format(). -
zip: ZIP-файл (если модуль
-
shutil.register_archive_format(name, function[, extra_args[, description]]) -
Регистрирует архиватор для формата name.
function — вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект получит base_name создаваемого файла, а также base_dir (по умолчанию
os.curdir) для начала архивирования.Дальнейшие аргументы передаются в качестве ключевых аргументов: owner, group, dry_run и logger (как в
make_archive()).Если задано, extra_args — последовательность пар
(name, value), которые будут использоваться в качестве дополнительных ключевых аргументов при использовании вызываемого объекта архиватора.description используется функцией
get_archive_formats()для возврата списка архиваторов. По умолчанию пустая строка.
-
shutil.unregister_archive_format(name) -
Удаляет формат архива name из списка поддерживаемых форматов.
-
shutil.unpack_archive(filename[, extract_dir[, format]]) -
Распаковывает архив. filename — полный путь к архиву.
extract_dir — имя целевого каталога, куда будет распакован архив. Если не задано, используется текущая рабочая директория.
format — формат архива: один из “zip”, “tar”, “gztar”, “bztar” или “xztar”. Или любой другой формат, зарегистрированный с помощью
register_unpack_format(). Если не задано,unpack_archive()использует расширение имени архива и проверяет, был ли зарегистрирован распаковщик для этого расширения. В случае, если таковой не найден, генерируетсяValueError.
-
shutil.register_unpack_format(name, extensions, function[, extra_args[, description]]) -
Регистрирует формат распаковки. name — имя формата, а extensions — список расширений, соответствующих формату, например,
.zipдля Zip-файлов.function — вызываемый объект, который будет использоваться для распаковки архивов. Вызываемый объект получит путь к архиву и директорию, в которую нужно распаковать архив.
Если задано, extra_args — последовательность пар
(name, value), которые будут переданы в качестве ключевых аргументов вызываемому объекту.description может быть предоставлен для описания формата и будет возвращен функцией
get_unpack_formats().
-
shutil.unregister_unpack_format(name) -
Удаляет формат распаковки. name — имя формата.
-
shutil.get_unpack_formats() -
Возвращает список всех зарегистрированных форматов распаковки. Каждый элемент возвращаемой последовательности — это кортеж
(name, extensions, description).По умолчанию модуль
shutilпредоставляет следующие форматы:- zip: ZIP-файл (распаковка сжатых файлов работает только если соответствующий модуль доступен).
- tar: нескомпрессированный tar-файл.
-
gztar: сжатый tar-файл (gzip) (если модуль
zlibдоступен). -
bztar: сжатый tar-файл (bzip2) (если модуль
bz2доступен). -
xztar: сжатый tar-файл (xz) (если модуль
lzmaдоступен).
Вы можете регистрировать новые форматы или предоставлять собственный распаковщик для любых существующих форматов, используя
register_unpack_format().
2.1. Пример архивирования
В этом примере мы создаем gzip'ed tar-файл, содержащий все файлы, которые находятся в каталоге .ssh пользователя:
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
>>> make_archive(archive_name, 'gztar', root_dir)
'/Users/tarek/myarchive.tar.gz'
Полученный архив содержит:
$ tar -tzvf /Users/tarek/myarchive.tar.gz drwx------ tarek/staff 0 2010-02-01 16:23:40 ./ -rw-r--r-- tarek/staff 609 2008-06-09 13:26:54 ./authorized_keys -rwxr-xr-x tarek/staff 65 2008-06-09 13:26:54 ./config -rwx------ tarek/staff 668 2008-06-09 13:26:54 ./id_dsa -rwxr-xr-x tarek/staff 609 2008-06-09 13:26:54 ./id_dsa.pub -rw------- tarek/staff 1675 2008-06-09 13:26:54 ./id_rsa -rw-r--r-- tarek/staff 397 2008-06-09 13:26:54 ./id_rsa.pub -rw-r--r-- tarek/staff 37192 2010-02-06 18:23:10 ./known_hosts
3. Определение размера выходного терминала
-
shutil.get_terminal_size(fallback=(columns, lines)) -
Получить размер окна терминала.
Для каждого из двух измерений проверяется переменная среды,
COLUMNSиLINESсоответственно. Если переменная определена и её значение — положительное целое число, оно используется.Когда
COLUMNSилиLINESне определены, что является общим случаем, терминал, подключенный кsys.__stdout__, запрашивается путём вызоваos.get_terminal_size().Если размер терминала невозможно успешно запросить, либо потому, что система не поддерживает запросы, либо потому, что мы не подключены к терминалу, используется значение, заданное в параметре
fallback.fallbackпо умолчанию равно(80, 24), что является стандартным размером, используемым многими эмуляторами терминалов.Возвращаемое значение — именованная кортеж типа
os.terminal_size.См. также: Спецификация Single UNIX, версия 2, Другие переменные окружения.
Введено в версии 3.3.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/shutil.html