Как скопировать файл в python
Перейти к содержимому

Как скопировать файл в python

  • автор:

Как копировать файлы из одной папки в другую, указав её полный путь

Прошу мне помочь с решением проблемы. Представим ситуацию, что есть exe (скомпилированный .py файл) и папка «files», где находятся какие-либо файлы. А есть ещё папка «end», которая находится, к примеру, на другом локальном диске. Как скопировать через Python файлы из папки «files» и, указав полный путь (C. ), вставить это в папке «end» (если требуется, то с заменой). Это может пригодится на пример с установкой модов во всякие игры (GTA SA на пример). Просьба привести примеры и скинуть понятный материал по этому. Заранее спасибо)

Отслеживать

задан 27 янв 2020 в 11:58

Матвей Воронцов Матвей Воронцов

13 2 2 серебряных знака 5 5 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

import os import shutil folder_from = r'otkuda' folder_to = r'kuda' for f in os.listdir(folder_from): if os.path.isfile(os.path.join(folder_from, f)): shutil.copy(os.path.join(folder_from, f), os.path.join(folder_to, f)) if os.path.isdir(os.path.join(folder_from, f)): os.system(f'rd /S /Q \\') shutil.copytree(os.path.join(folder_from, f), os.path.join(folder_to, f)) 

Отслеживать

ответ дан 27 янв 2020 в 12:48

11.9k 2 2 золотых знака 11 11 серебряных знаков 28 28 бронзовых знаков

Модуль shutil

Python 3 логотип

Модуль 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 позволяют не только манипулировать данными в текстовых документах, но и всячески управлять ими самими. Для этого существует несколько специальных библиотек, встроенные функции которых обеспечивают копирование, удаление, переименование и прочие разновидности операций с файлами на компьютере.

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

Избежать досадных ошибок при работе с текстовым документом, которые могут быть связаны с его отсутствием на жестком диске компьютера, поможет метод exists из модуля os. Его вызов позволяет проверить в Python существование файла по указанному пути, получив в качестве результирующего ответа булево значение True или False. Чтобы воспользоваться данным методом, необходимо прежде всего подключить библиотеку os, а затем вызвать exists у класса path. Следующий пример на Python показывает проверку наличия файлов test.txt и test10.txt в корневом каталоге жесткого диска D. Функция print показывает, что в наличии на D только первый документ.

import os print(os.path.exists("D:\\test.txt")) print(os.path.exists("D:\\test10.txt")) True False

Иногда при работе с документами возникает потребность в проверке не только существования некоего объекта по заданному пути. Функция isfile из уже упомянутой здесь библиотеки os дает программисту возможность убедиться в том, что полученный по определенному адресу объект на жестком диске компьютера является файлом, а не папкой. Данный метод также находится в классе path. В следующем примере показывается реакция isfile на получение в качестве аргумента файла test.txt и каталога folder в корне D. Как видно из результатов работы функции print, в первом случае отображается True, а затем False.

import os print(os.path.isfile("D:\\test.txt")) print(os.path.isfile("D:\\folder")) True False

Проверить наличие файла по указанному адресу можно и с помощью функции open, применив дополнительно конструкцию with as. Данный метод производит открытие документа для того, чтобы программа могла взаимодействовать с его содержимым. Если функция open смогла без ошибок выполниться, это означает, что по переданному ей в качестве аргумента пути имеется файл. Если же произойдет исключение, то файл не удалось открыть. Это еще не говорит о том, что его нету. Возможно, к примеру, не достаточно прав доступа к нему. В приведенном ниже примере программа сообщает о наличии искомого документа при помощи метода print. Как видно из результатов, на экран выводится сообщение file is open.

try: with open("D:\\test.txt") as file: print("file is open") except: print('no open') file is open

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

Библиотека под названием shutil включает в себя несколько полезных функций для создания копий объектов на жестком диске. Чтобы быстро скопировать файл в исходный каталог, стоит воспользоваться методом copyfile, предварительно подключив модуль shutil. В роли первого аргумента здесь выступает оригинальный документ, в то время как вторым параметром нужно поставить предполагаемый новый файл. Стоит учитывать, что копируется только содержимое, но не метаданные. В следующем примере происходит копирование данных из файла test.txt в test2.txt на диске D. Функция copyfile также возвращает адрес созданного документа.

import shutil shutil.copyfile("D:\\test.txt", "D:\\test2.txt")

Встроенный метод copy из модуля shutil позволяет в Python копировать файл в указанную папку, сохраняя при этом его изначальное имя. Приведенный ниже пример кода демонстрирует копирование информации из test.txt в объект, который находится на диске D в каталоге под названием folder. Как и в предыдущем случае с функцией copyfile, переносятся только внутренние данные, но не сведения о дате создания и редактирования документа.

import shutil shutil.copy("D:\\test.txt", "D:\\folder")

Чтобы полностью скопировать информацию из текстового файла, а также все сведения о нем, необходимо воспользоваться готовым методом copy2. Способ его применения такой же, как и в случае с функцией copy. На месте первого параметра здесь размещается адрес изначального файла, в то время как второй аргумент сообщает локацию и название нового документа. Ниже показан пример, где содержимое и метаданные копируются в test2.txt из папки folder.

import shutil shutil.copy2("D:\\test.txt", "D:\\folder\\test2.txt")

Удаление файла

Избавиться от объекта, если известно его имя и точное расположение на диске, очень легко. С этой задачей поможет справиться метод remove из уже упомянутой ранее библиотеки os. Все, что требуется сделать, это передать ей в качестве параметра полный адрес ненужного файла, не забыв для начала подключить модуль os. Ниже приведен пример того, как с помощью скрипта Python удалить файл test.txt в корне диска D.

import os os.remove("D:\\test.txt")

Получение размера файла

Определить точный размер любого объекта на жестком диске можно с помощью стандартной функции getsize из модуля os, которая возвращает величину файла в байтах. Выполнив импорт библиотеки os, необходимо вызвать метод класса path. Аргументом тут выступает расположение документа в памяти компьютера. Согласно результатам выполнения getsize, размер test.txt составляет 7289. Метод print выводит это на экран.

import os print(os.path.getsize("D:\\test.txt")) 7289

Вычислить размер файла в Python можно и другим способом, открыв его при помощи open, после чего вызвав функцию seek. Ей необходимо передать в качестве параметра область для чтения данных, начиная от начала файла до его конца. В итоге следует вызвать метод tell через ссылку на текстовый файл, а затем отправить результат его работы в print для вывода в консоль.

import os with open("D:\\test.txt") as file: file.seek(0, os.SEEK_END) print(file.tell()) 7289

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

Изменить название документа можно не только благодаря средствам системы, но и с помощью готовых функций модуля os. С этой задачей хорошо справляется метод rename, принимающий в качестве параметров исходное и новое имя файла. Следующий пример показывает работу с документом test.txt в корневом каталоге диска D, который переименовывается в test1.txt.

import os os.rename("D:\\test.txt", "D:\\test1.txt")

Аналогично, можно в Python переименовать файл с помощью метода move из модуля shutil. Подключив данную библиотеку, достаточно лишь передать функции местоположение и новое имя документа. Код программы, где продемонстрировано переименование test.txt в test1.txt, находится ниже.

import shutil shutil.move("D:\\test.txt", "D:\\test1.txt")

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

Как скопировать файл в 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 ?

Домашнее задание

  1. Попробуйте поменять название файлов на рабочем столе. Не забудьте также изменить названия файлов в программе.
  2. Попробуйте поменять переменные в коде программы.
  3. Попробуйте сократить код, чтобы он был меньше. Программистам часто приходится сокращать код, убирая ненужные строки текста или сокращая строки кода из двух-трех в одну.
  4. Напишите комментарий к каждой строчке программного кода. Это очень сильно будет продвигать вас в понимании программирования на Python 2.7.

В следующем уроке мы начнем знакомство с функциями в Питоне - перейти в урок 22.

  • Вы здесь:
  • Главная
  • Python 2.7 с нуля
  • Урок 21. Копирование содержимого файлов в Питоне 2.7

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *