Python 3 копирование файла. Сохранение файлов с python. Как это работает

На iOS - iPhone, iPod touch 02.03.2019

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

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

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 . Функция возвращает путь к местонахождению нового скопированного файла.

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()).

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

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

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

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

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

Например:

copytree (source , destination , ignore = ignore_patterns ("*.pyc" , "tmp*" )) # Скопирует все файлы, кроме заканчивающихся на.pyc или начинающихся с tmp

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) - возвращает статистику использования дискового пространства как с арибутами 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 . get_archive_formats () [("bztar", "bzip2"ed tar-file"), ("gztar", "gzip"ed tar-file"), ("tar", "uncompressed tar file"), ("xztar", "xz"ed tar-file"), ("zip", "ZIP file")]

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).

>>> shutil . get_terminal_size () os.terminal_size(columns=102, lines=29) >>> shutil . get_terminal_size () # Уменьшили окно os.terminal_size(columns=67, lines=17)

06-04-2013 / redVi

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

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

- tkinter - Tk - самая простая и распространённая библиотека. Используется очень широко. Документация подробна и содержит всё необходимое для быстрого начала работы.

-PyQt - интерфейс к библиотеке Qt . Эта библиотека также переносима на Linux, Windows и MacOS. Хотя стоит отметить, что интерфейс программы, естественно, будет отличаться от “родных” приложений и только в случае со связкой Linux+KDE будет выглядеть как влитой. Тем не менее используется очень широко. Документация отличная. В написании кода, пожалуй, наиболее сложен.

PyGTK - как и предыдущий привязан к своей оконной системе. Не так распространён как три библиотеки, данные выше.

Разумеется, графических библиотек намного больше. Указанные здесь - основные. Автором рекомендуется выбирать между wxPython и Tkinter . Дабы использовать какую-либо библиотеку, нужно её установить (исключением является разве что OS Windows, где python, похоже, поставляется в чуть ли не полной комплектации). Разбираемый сегодня пример будет задействовать библиотеку tkinter и потребует установки модуля tk . Пользователи Linux могут найти его с помощью своего пакетного менеджера или собрать python с ключом tk (для gentoo).

Как это работает?

tkinter - программный слой поверх Tk , позволяющий сценариям на языке Python обращаться к библиотеке Tk , конструирующей и настраивающей интерфейсы и возвращающей управление обратно в сценарии Python, которые обрабатывают события, генерируемые пользователем (например, щелчки мышью). Таким образом, обращения к графическому интерфейсу из сценария Python направляются в tkinter, а затем в Tk; события, возникающие в графическом интерфейсе, направляются из Tk в tkinter, а затем обратно в сценарий Python.

~Марк Лутц - программирование на Python 4 изд. I том~

Начали импорт

# pybackup.py # #! /usr/bin/env python # -*- coding: utf-8 -*- import os import shutil from tkinter.messagebox import * from tkinter.filedialog import *

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

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

импортирование модулей из tkinter.filedialog даст нам возможность вызывать диалоговые окна, из messagebox - создавать сообщения, уведомления для пользователя

Функция выбора директории для копирования, получение доступа к описанию функции.

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

При импорте модуля можно будет обратиться к ней, вызвав команду backup.savefiles.__doc__ - то есть имя_модуля.имя_функции.__описание__ :

>>> backup.savefiles.__doc__ "Ask where save your files"

Полученный нами в итоге модуль не предназначен для расширения или импортирования, тем не менее строки документации создавать всё же нужно.

Далее используется переменная dst, которая впоследствии примет значение указанной пользователем директории. Значение будет строковым. Здесь переменная сделана глобальной поскольку должна быть доступна и другим функциям.

dst = askdirectory() - запросит у пользователя выбор директории для сохранения файлов

print (type(dst)) и print(dst) будут выводить в консоли информацию для нас, дабы мы могли увидеть какой тип получился у переменной, когда пользователь выбрал директорию. Можно удалить строки с print .

Функция выбора файлов для бекапа и вложенная функция копирования выбранных файлов

def _selectfile (): """Select your files for backup""" src = askopenfilenames () src = list (src ) print (type (src )) print (src ) def save (): """Save files""" for listcopy in src : listname = os . path . join (listcopy ) shutil . copy (listname , dst ) print ("Backup file is OK" ) save ()

askopenfilenames - выбрать файлы для копирования. Поскольку в итоге мы получим кортеж, а кортежи неизменяемы, сразу же конвертируем его в список: list(src) .

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

shutil.copy - скопировать

listname - файлы из списка

dst - куда копируем

Функция выбора директории и вложенная функция рекурсивного копирования

def _selectdirectory (): """Select your directory for backup""" src2 = askdirectory () print (type (src2 )) print (src2 ) def save2 (): """Save directories and files""" print ("make backup " + src2 ) names = os . listdir (src2 ) if not os . path . exists (dst ): os . mkdir (dst ) for name in names : srcname = os . path . join (src2 , name ) dstname = os . path . join (dst , name ) if os . path . isdir (srcname ): shutil . copytree (srcname , dstname ) if os . path . isfile (srcname ): shutil . copy (srcname , dstname ) print ("Backup is OK" ) save2 ()

askdirectory - выбрать директорию для копирования. В функцию включена проверка для рекурсивного копирования поддиректорий. Если srcname - поддиректория (os.path.isdir), будет выполнено рекурсивное копирование (copytree). Если в выбранная директория помимо поддиректорий содержит обычные файлы (os.path.isfile), копирование этих файлов (copy).

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

os.path.join - “склеивает” пути

Функция, закрывающая программу

def close_win (): """Close window and exit programm""" if askyesno ("Exit" , "Do you want to quit?" ): root . destroy ()

Функция, показывающая информационное окно

def about (): showinfo ("Backup" , "This is simple backup programm. \n (test version)" )

root = Tk () m = Menu (root ) root . config (menu = m ) fm = Menu (m ) m . add_cascade (label = "File" , menu = fm ) fm . add_command (label = "Select directory for save" , command = savefiles ) fm . add_command (label = "Select files for copy." , command = _selectfile ) fm . add_command (label = "Select directories for copy" , command = _selectdirectory ) fm . add_command (label = "Exit" , command = close_win ) hm = Menu (m ) m . add_cascade (label = "Help" , menu = hm ) hm . add_command (label = "About" , command = about ) txt = Text (root , width = 40 , height = 25 , font = "22" ) txt . pack () root . mainloop ()

root = Tk() - создать главное окно

m = Menu(root) - создать меню, привязанное к главному окну

root.config(menu=m) - для создания списка в меню (add_cascade)

fm = Menu(m) - создание пунктов в списке

Всё дальнейшее просто: fm.add_command - вызовет указанное действие; label - метка, то, как будет называться пункт меню; command - указание на функцию, которая должна быть выполнена при нажатии пунтка меню; pack() - менеджер расположения. Он отвечает за то, как виджеты будут располагаться на главном окне.

root.mainloop() - специальный обязательный метод. Без него главное окно не появится.

Что не так?

Если вам понятен приведённый пример, вы уже можете сказать, чего в нём не хватает. Например, вы можете обнаружить, что при повторном копировании объектов одной и той же директории, замена файлов происходит, а замена поддиректорий - нет. Вам лишь укажут на тот факт, что такая поддиректория уже существует и выполнение программы прекратится. В качестве самостоятельной работы предлагается изучить конструкцию try-except или модуль errno и проработать этот момент. Например:

def save2 (): """Save directories""" try : print ("make backup " + src2 ) names = os . listdir (src2 ) if not os . path . exists (dst ): os . mkdir (dst ) for name in names : srcname = os . path . join (src2 , name ) dstname = os . path . join (dst , name ) if os . path . isdir (srcname ): shutil . copytree (srcname , dstname ) if os . path . isfile (srcname ): shutil . copy (srcname , dstname ) print ("Backup is OK" ) except OSError : shutil . rmtree (dstname ) print ("Try again" ) if os . path . isdir (srcname ): shutil . copytree (srcname , dstname ) if os . path . isfile (srcname ): shutil . copy (srcname , dstname ) print ("Backup is OK" ) save2 ()

В Windows копирование файла/файлов работать не будет: сие есть последствие использования этой ОС не православных путей к файлам (обратный слэш). Возможно, пользователям Windows будет интересно изменить код таким образом, чтобы данная функция работала.

Кстати: чтобы программа в Windows запускалась при двойном клике, измените расширение на.pyw Кроме того, предлагается поупражняться с tkinter и выводить всплывающее окно “Wait, please!” во время копирования (наподобие того, как это сделано при закрытии программы).

Перемещать и копировать файлы по каталогам нам поможет функции модуля 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: 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.



Рекомендуем почитать

Наверх