shutil — Высокоуровневые операции с файлами
Исходный код: Lib/shutil.py
Модуль shutil предоставляет ряд высокоуровневых операций с файлами и коллекциями файлов. В частности, предоставляются функции, которые поддерживают копирование и удаление файлов. Для операций с отдельными файлами см. также модуль os.
Предупреждение
Даже высокоуровневые функции копирования файлов (shutil.copy(), shutil.copy2()) не могут скопировать все метаданные файла.
В платформах POSIX это означает потерю владельца и группы файла, а также ACL. В Mac OS не используются ресурсный вилка и другие метаданные. Это означает, что ресурсы будут потеряны, а коды типа и создателя файла не будут корректными. В Windows не копируются владельцы файлов, ACL и альтернативные потоки данных.
Операции с каталогами и файлами
-
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 имеет значение false, и 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 имеет значение false, и src и dst — символические ссылки,
copymode()попытается изменить режим самого dst (а не файла, на который он указывает). Эта функциональность недоступна во всех платформах; см.copystat()для получения дополнительной информации. Еслиcopymode()не может изменить символические ссылки на локальной платформе, то ничего не делает и возвращается.Изменено в версии 3.3: Добавлен аргумент follow_symlinks.
-
shutil.copystat(src, dst, *, follow_symlinks=True) -
Копирует биты разрешений, время последнего доступа, время последней модификации и флаги из src в dst. В Linux
copystat()также копирует «расширенные атрибуты», где это возможно. Содержимое файла, владелец и группа не затрагиваются.Если follow_symlinks имеет значение false, и 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 имеет значение false, и src — символическая ссылка, dst будет создан как символическая ссылка. Если follow_symlinks имеет значение true, и src — символическая ссылка, dst будет копией файла, на который ссылается src.
copy()копирует данные файла и режим разрешений файла (см.os.chmod()). Другие метаданные, такие как время создания и модификации файла, не сохраняются. Для сохранения всех метаданных исходного файла используйтеcopy2().Изменено в версии 3.3: Добавлен аргумент follow_symlinks. Теперь возвращает путь к вновь созданному файлу.
-
shutil.copy2(src, dst, *, follow_symlinks=True) -
Идентично
copy(), за исключением того, чтоcopy2()также пытается сохранить метаданные файла.Когда follow_symlinks имеет значение false, и src — символическая ссылка,
copy2()пытается скопировать все метаданные из символической ссылки src в вновь созданную символическую ссылку dst. Однако эта функциональность недоступна во всех платформах. В платформах, где часть или вся эта функциональность недоступна,copy2()сохранит все метаданные, которые сможет;copy2()никогда не возвращает ошибку.copy2()используетcopystat()для копирования метаданных файла. См.copystat()для получения дополнительной информации о поддержке платформы для изменения метаданных символических ссылок.Изменено в версии 3.3: Добавлен аргумент follow_symlinks, попытка скопировать расширенные атрибуты файловой системы (пока только Linux). Теперь возвращает путь к вновь созданному файлу.
-
shutil.ignore_patterns(*patterns) -
Эта фабричная функция создаёт функцию, которая может использоваться в качестве вызываемой функции для аргумента ignore
copytree(), игнорируя файлы и каталоги, соответствующие одному из шаблонов glob, предоставленных patterns. Смотрите пример ниже.
-
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: Добавлена явная обработка символических ссылок для внешних файловых систем, таким образом адаптирующая её к поведению mv GNU. Теперь возвращает dst.
Изменено в версии 3.5: Добавлен ключевой аргумент copy_function.
-
shutil.disk_usage(path) -
Возвращает статистику использования диска для заданного пути в виде именованной кортежи с атрибутами total, used и free, которые представляют собой объем общего, используемого и свободного места в байтах. В Windows, path должен быть каталогом; в Unix, это может быть файл или каталог.
Добавлена в версии 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).
Пример 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)
Пример 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)
Операции архивирования
Новое в версии 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 — каталог, который будет корневым каталогом архива; все пути в архиве будут относительными к нему. Например, обычно выполняем chdir в root_dir перед созданием архива.
base_dir — каталог, с которого мы начинаем архивирование; то есть base_dir будет общим префиксом всех файлов и каталогов в архиве. base_dir должен быть задан относительно root_dir. См. Пример архивирования с base_dir о том, как использовать base_dir и root_dir вместе.
root_dir и base_dir по умолчанию равны текущему каталогу.
Если dry_run истинно, архив не создаётся, а операции, которые должны быть выполнены, регистрируются в logger.
owner и group используются при создании архива tar. По умолчанию используются текущий владелец и группа.
logger должен быть объектом, совместимым с PEP 282, обычно экземпляром
logging.Logger.Аргумент verbose не используется и устарел.
-
shutil.get_archive_formats() -
Возвращает список поддерживаемых форматов архивирования. Каждый элемент возвращаемой последовательности — кортеж
(name, description).По умолчанию
shutilпредоставляет эти форматы:-
zip: ZIP-архив (если модуль
zlibдоступен). - tar: нескомпрессированный tar-архив.
-
gztar: gzip’ed tar-архив (если модуль
zlibдоступен). -
bztar: bzip2’ed tar-архив (если модуль
bz2доступен). -
xztar: xz’ed tar-архив (если модуль
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.Изменено в версии 3.7: Принимает объект-путь для filename и extract_dir.
-
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: gzip’ed tar-архив (если модуль
zlibдоступен). -
bztar: bzip2’ed tar-архив (если модуль
bz2доступен). -
xztar: xz’ed tar-архив (если модуль
lzmaдоступен).
Вы можете зарегистрировать новые форматы или предоставить собственный распаковщик для любых существующих форматов, используя
register_unpack_format().
Пример архивирования
В этом примере мы создаем архив 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
Пример архивирования с base_dir
В этом примере, аналогичном приведенному выше, мы показываем, как использовать make_archive(), но на этот раз с использованием base_dir. Теперь у нас есть следующая структура каталогов:
$ tree tmp
tmp
└── root
└── structure
├── content
└── please_add.txt
└── do_not_add.txt
В конечном архиве должен быть включен please_add.txt, но do_not_add.txt — нет. Поэтому мы используем следующее:
>>> from shutil import make_archive
>>> import os
>>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
>>> make_archive(
... archive_name,
... 'tar',
... root_dir='tmp/root',
... base_dir='structure/content',
... )
'/Users/tarek/my_archive.tar'
Вывод списка файлов в результирующем архиве:
$ python -m tarfile -l /Users/tarek/myarchive.tar structure/content/ structure/content/please_add.txt
Определение размера выходного терминала
-
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.7/library/shutil.html