Модуль shutil
Модуль 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.chown(path, user=None, group=None) — меняет владельца и/или группу у файла или директории.
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 в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Как скопировать файл в python
В этом уроке мы научимся копировать, то есть переносить, содержимое из одного файла в другой при помощи команд Python 2.7. Из любого файла в любой же файл. Это пригодится вам в дальнейшей работе при создании более сложных программ.
Практический пример
Создаем на рабочем столе текстовый файл test17_text.txt и вписываем в него ЛЮБОЙ текст.
Сохраняем текстовый файл в кодировке OEM 866. Это нужно для того, чтобы на экране выводились кириллические буквы, а не кракозябры. Как сохранить: в программе Notepad++ нажимаем вверху на: Кодировки - Кодировки -Кириллица - OEM 866 .
Теперь создаем на рабочем столе файл test17.py Пишем в него следующий программный код:
# -*- coding: utf- 8 -*- from sys import argv from os.path import exists script, old_file, new_file = argv print u"Перенос содержимого из старого файла %s в новый файл %s" % (old_file, new_file) first_file = open(old_file) indata = first_file.read() print u"Старый файл - размером %d байт" % len(indata) print u"Новый файл существует? %r" % exists(new_file) print u"Все ОК, нажмите Enter для продолжения работы скрипта или CTRL+C для его отмены." raw_input() second_file = open(new_file, 'w') second_file.write(indata) print u"Все готово. " second_file.close() first_file.close()
Краткое пояснение к коду
В начале нашего скрипта – как обычно – прописываем работу с переменной argv (более подробно работа с argv разбирается ЗДЕСЬ и ЗДЕСЬ).
Вторая строка кода – это импорт из модуля os.path . Что это за модуль? os.path – это модуль, вложенный в модуль os . Модуль os – это модуль, позволяющий программисту на Питоне работать с операционной системой компьютера. А модуль os.path – это модуль, позволяющий программе работать с путями, существующими в операционной системе.
Функция exists позволяет программе и пользователю понять, существует ли файл или не существует. Если он существует, функция вернет значение True , если файла не существует, функция exists вернет значение False .
Далее присваиваем переменной argv названия файлов (название файла со скриптом на Питоне, который мы написали, а также старого и нового текстовых файлов).
Далее прописываем, что программа должна открыть старый файл и все его содержимое присвоить переменной first_file . Далее выполняем чтение этого содержимого и присваиваем его переменной indata .
Далее мы должны узнать размер содержимого, которое будем копировать, в байтах.
Все, что прописываем далее, вы уже должны знать из предыдущих уроков. Если забыли, идем СЮДА и повторяем.
Теперь открываем программу PowerShell и прописываем команду: python desktop/test17.py desktop/test17_text.txt desktop/test17_text_new.txt Заметьте, что мы прописываем также название третьего, то есть создаваемого текстового файла test17_text_new.txt , который программа создаст и в который скопирует все содержимого из старого текстового файла test17_text.txt
Далее выполняем требования программы.
В итоге у вас должно получиться также, как на картинке.

А теперь не забудьте на рабочем столе найти новый созданный файл test17_text_new.txt и посмотрите его содержимое - совпадает ли с содержимым старого файла test17_text.txt ?
Домашнее задание
- Попробуйте поменять название файлов на рабочем столе. Не забудьте также изменить названия файлов в программе.
- Попробуйте поменять переменные в коде программы.
- Попробуйте сократить код, чтобы он был меньше. Программистам часто приходится сокращать код, убирая ненужные строки текста или сокращая строки кода из двух-трех в одну.
- Напишите комментарий к каждой строчке программного кода. Это очень сильно будет продвигать вас в понимании программирования на Python 2.7.
В следующем уроке мы начнем знакомство с функциями в Питоне - перейти в урок 22.
- Вы здесь:
- Главная
- Python 2.7 с нуля
- Урок 21. Копирование содержимого файлов в Питоне 2.7
Копирование файлов в Python
23 мая 2013 г.
Archy
Просмотров: 94257
RSS
3
Python для начинающих
python copy, python move, python shutil, python работа с файлами

Перемещать и копировать файлы по каталогам нам поможет функции модуля shutil. Подключаем модуль shutil в начале нашего скрипта на Python, потом уже получим доступ к его функциям. Функции модуля shutil не ограничиваются только на копирование и перемещение, мы обсудим разные методики использования функции даного модуля.
Функция copyfile(Копируемый файл, путь куда копируем)
Копирует содержимое файла по указанному пути и создает новый в указанном во втором параметре месте. Методанные при этом не копируются т.е. права доступа и т.д. Если место куда мы копируем уже имеет такой файл он будет перезаписан. В случае неудачи копирования, возбуждается исключение IOError.
>>> import shutil # Подключаем модуль >>> shutil.copyfile(r'/home/py/mouse.txt', r'/home/py/new-mouse.txt') >>> # Указанный путь не будет существовать >>> shutil.copyfile(r'/home/py/mouse.txt', r'/go/here/no.txt') IOError: [Errno: 2] No such file or directory '/go/here/no.txt'
Функция copy(Копируемый файл, куда копируем)
Копирует файл вместе с его правами. В случае если файл уже существовал, он будет перезаписан. Неудачное копирование вызовет исключение IOError.
shutil.copy(r'my_file.txt', r'new_file.txt')
Сайт avi1.ru поможет Вам заказать платные лайки в Ютубе с очень большими оптовыми скидками. Торопитесь, пока действует предложение. Также на страницах данного сервиса Вы сможете найти все, что нужно для продвижения в Ютубе: подписчиков, просмотры и т. д.
Функция copy2(Копируемый файл, путь куда копируем)
Копирует файл вместе с его методанными. Если файл уже существует, он будет перезаписан.
shutil.copy2(r'mendel.txt', r'file.txt')
Перемещение файла, функция move(путь к файлу, путь куда перемещать)
Копирует файл из указанного места, создает новый или перезаписывает уже существующий по новому пути. После выполнения копирования, копируемый файл удаляется. Бывает случай, что файл не удается удалить, в Windows возбуждается исключение WindowsError.
shutil.move(r'book.pdf', r'D:\Books')
Летняя жара дает о себе знать, программируя нельзя концентрироваться из за сухого воздуха и душной обстановки. Решить данную проблему можно установив инверторные кондиционеры Mitsubishi у себя дома или в офисе. Сделайте себе и окружающим приятно.
Еще записи по теме
- Pundle — bundler для python
- Как подружить Slack и VK с помощью Python?
- Наследование. Объектно-ориентированное программирование в Python
- Разработка на Django под Windows при помощи Docker-machine
- Создание своего веб-фреймворка на Python - Часть 1
- Как работают функции в Python?
- Полезные курсы по языку программирования Python
Копирование файла в Python: метод Shutil.copy(), Shutil.copystat()
Python предоставляет встроенные функции для простого копирования файлов с помощью утилит оболочки операционной системы.
Следующая команда используется для копирования файла
shutil.copy(src,dst)
Следующая команда используется для копирования файла с информацией о метаданных.
shutil.copystat(src,dst)
Как скопировать файл в Python
Вот шаги для копирования файла в Python с использованием метода Shutil copy():
Шаг 1) Захватить исходный путь в текущем каталоге
Прежде чем копировать файл, нам нужно получить путь к исходному файлу в текущем каталоге. В коде –
- Объявление переменной
- Применение функции разделения к переменной

Код Пояснение
- Сначала мы проверим, существует ли наш файл «guru99.txt». Поскольку ранее мы создали файл guru99.txt, мы знаем, что он существует, и продолжим работу с кодом.
- Мы сохраняем путь к файлу в переменной «SRC», если ваш файл существует
- Как только мы получим путь, мы разделим путь и имя файла.
- Для этого мы воспользуемся разделением path.split функция для исходной переменной
- Код при выполнении выводит «имя файла(Основной ключ) и Путь файла" в отдельности
Шаг 2) Создайте копию существующего файла с помощью модуля Shutil.
Мы используем модуль Shutil для создания копии существующего файла. Здесь мы создавали копию существующего файла «guru99.txt».

Код Пояснение
- Возьмите исходное имя файла «guru99.txt» и добавьте буквы .bak в конце «guru99.txt.bak». Это имя с расширением .bak будет нашей копией-дубликатом.
- А затем мы собираемся использовать функцию копирования утилиты для копирования из источника в место назначения.
- Когда вы запустите код, вы увидите, что в правой части панели создается дубликат файла с расширением .bak.
Шаг 3) Копирование метаданных, связанных с файлом, разрешением файла и другой информацией.
Функция копирования копирует только содержимое файла, но не другую информацию. Копировать мета-данные связанный с файлом, разрешениями на файл и другой информацией, которую вы должны использовать»копистат» функция. Прежде чем запустить этот код, нам нужно удалить файл копии «guru99.text.bak».

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

Вот код
import os import shutil from os import path def main(): # make a duplicate of an existing file if path.exists("guru99.txt"): # get the path to the file in the current directory src = path.realpath("guru99.txt"); #seperate the path from the filter head, tail = path.split(src) print("path:" +head) print("file:" +tail) #let's make a backup copy by appending "bak" to the name dst = src+".bak" # nowuse the shell to make a copy of the file shutil.copy(src, dst) #copy over the permissions,modification shutil.copystat(src,dst) if __name__=="__main__": main()
Шаг 4) Получить информацию
Вы можете получить информацию о последнем измененном текстовом файле.

Строка кода № 15. В ней указывается день, дата, месяц, год и время последнего изменения файла .txt (guru99). Мы используем модуль пути, чтобы получить подробную информацию о времени изменения файла, а затем мы собираемся использовать модуль классы времени c функция времени чтобы преобразовать это в читаемое время. Итак, когда мы запустим код, мы увидим, что файл guru99.txt последний раз изменялся. Пн, янв 8 th в 13:35 2018.
Строка кода № 17. Она делает то же самое, предоставляя информацию об изменении файла, но имеет другой формат для ее представления. Здесь мы используем Получить функцию времени модификации (path.getmtime("guru99.txt")). Теперь вместо использования функции времени c мы собираемся использовать Из функции отметки времени и собираюсь создать объект даты и времени. В выводе вы можете увидеть, что сведения о времени изменения файла распечатаны в другом формате. 2018-01-08, 13:35:51.334072
Вот код
# # Example file for working with o.s path module import os from os import path import datetime from datetime import date, time, timedelta import time def main(): # Get the modification time t = time.ctime(path.getmtime("guru99.txt.bak")) print(t) print(datetime.datetime.fromtimestamp(path.getmtime("guru99.txt.bak"))) if __name__ == "__main__": main()
Итоги
- Чтобы создать копию существующего файла с помощью кода Shutil.copy (источник, dst)
- Чтобы скопировать всю информацию исходного файла в дубликат файла, например разрешение файла, время модификации или информация метаданных с помощью кода Shutil.copystat(src,dst)
- Онлайн-компилятор Python (редактор/интерпретатор/IDE) для запуска кода
- Учебное пособие по PyUnit: Платформа модульного тестирования Python (с примером)
- Как установить Python в Windows [Pycharm IDE]
- Hello World: создайте свою первую программу на Python
- Переменные Python: как определить/объявить типы строковых переменных
