Python переместить файл в другую папку
Работа с файлами является базовым навыком для любого программиста. Файлы очень часто используются для сохранения данных приложения, файлов конфигурации, видео и изображений. Есть очень много случаев в программировании когда вам понадобится работать с файлами, по этому вам нужно разобраться как правильно манипулировать файлами. Самые популярные операции с файлами это создание, удаление, перемещение.
В этой статье будет сделан обзор работы с файлами в языке программирования Python. Встроенные методы делают обработку файлов очень простой, без необходимости написания большого количества кода. Как и со всеми задачами в программировании, существует много способов достижения одной цели при работе с файлами, но в этой статье описаны базовые и самые распространенные способы.
Создания файлов в Python
Режимы открытия файлов
Существует несколько режимов открытия файлов в Python. Выбирать режим нужно в зависимости от того как вы собираетесь использовать файл, или от того какие данные вы будете читать/записывать. Режим задается при открытии файла встроенным методом open(), его более детальное описание будет изложено ниже.
Давайте рассмотрим какие существуют режимы открытия файлов:
- w : Открывает файл для записи и создает файл если он не существует
- w+ : Открывает файл для записи и создает если он не существует. Но если файл уже существует, то перезаписывает его.
- r: Открывает файл только для чтения.
- rb: Открывает файл только для чтения в двоичном формате.
- wb: Открывает файл для записи в двоичном формате
- wb+: Открывает файл для чтения и записи в двоичном формате.
- a: Открывает файл только для добавления в конец его содержимого
- +: В общем, этот символ используется в комбинации с r, w, или a и значит что файл открыт для записи и чтения.
По умолчанию используется режим r
При выборе режима, внимательно изучите что вы будете делать с файлом, и как файл будет использоваться в течение всего времени его открытия.
open()
Как и с большинством операций в Python, выполнение многих задач, связанных с файлами, делается очень просто. Например, создание файла в Python может выполняться в одной строке кода:
В примере выше, мы открыли файл «new.txt», для чтения и записи. В нашем случае файл не существует, и он будет автоматически создан.
Метод open() принимает много аргументов, но в большинстве случаев вам понадобятся эти два:
filename — Обязательный аргумент, для указания имени файла
mode — необязательный аргумент, для установления режима чтения.
close()
Когда вы открываете файлы вы должны удостоверится что они будут вовремя закрыты. Для выполнения операции закрытия файла используется метод close() или открытия файла с использованием команды with, которая автоматически закроет файл когда он окажется за пределами области видимости.
Если вы будете держать ваши файлы открытыми, это замедлить вашу программу и в некоторых случаях заблокирует чтения файла другими в других частях программы. Сборщик мусора Python может автоматически закрыть неиспользуемые файлы, но вам не стоит полагаться на это.
Повторный вызов метода close() никак не повлияет на состояние закрытого файла.
myFile.close()
Перемещения файлов в Python
Для того чтобы переместить файл в Python, нужно импортировать модули os и shutil, которые предоставляют возможность копировать, перемещать, и удалять файлы в Python. Эти два модули самодостаточны, но в большинстве случаев shutil имеет более удобный интерфейс.
Держите в уме то что директория в которую вы хотите переместить файл должна существовать, чтобы примеры выше работали.
Удаления файлов в Python
Как уже вы наверное догадались, это довольно просто удалить файл в Python используя метод remove() из модуля os. В примере нижы мы удалим файл, все что нужно сделать это передать его имя при вызове remove()
В этой статье, мы показали очень простые примеры, того как создавать, перемещать и удалять файлы в Python с помощью встроенных методов open(), shutil.move() и os.remove(). А также ознакомились с режимами открытия файлов.
Обработка файлов в Python с помощью модуля os включает создание, переименование, перемещение, удаление файлов и папок, а также получение списка всех файлов и каталогов и многое другое.
В индустрии программного обеспечения большинство программ тем или иным образом обрабатывают файлы: создают их, переименовывают, перемещают и так далее. Любой программист должен обладать таким навыком. С этим руководством вы научитесь использовать модуль os в Python для проведения операций над файлами и каталогами вне зависимости от используемой операционной системы.
Важно знать, что модуль os используется не только для работы с файлами. Он включает массу методов и инструментов для других операций: обработки переменных среды, управления системными процессами, а также аргументы командной строки и даже расширенные атрибуты файлов, которые есть только в Linux.
Модуль встроенный, поэтому для работы с ним не нужно ничего устанавливать.
Изменение директории
Менять директории довольно просто. Проделаем это с только что созданным:
Еще раз выведем рабочий каталог:
Извлечение расширения
Кроме того, может пригодиться функция os.path.splitext , котоая отрезает расширение файла:
Создание файлов
Для создания файлов в Python модули не нужны. Можно использовать встроенную функцию open() . Она принимает название файла, который необходимо создать в качестве первого параметра и желаемый режим открытия — как второй:
w значит write (запись), a — это appending (добавление данных к уже существующему файлу), а r — reading (чтение). Больше о режимах открытия можно почитать здесь.
Вывод текущей директории
Для получения текущего рабочего каталога используется os.getcwd() :
os.getcwd() возвращает строку в Юникоде, представляющую текущий рабочий каталог. Вот пример вывода:
Удаление файлов
Удалим созданный файл:
os.remove() удалит файл с указанным именем (не каталог).
Показать текущий каталог
Самая простая и вместе с тем одна из самых важных команд для Python-разработчика. Она нужна потому, что чаще всего разработчики имеют дело с относительными путями. Но в некоторых случаях важно знать, где мы находимся.
Относительный путь хорош тем, что работает для всех пользователей, с любыми системами, количеством дисков и так далее.
Так вот, для того чтобы показать текущий каталог, нужна встроенная в Python OS-библиотека:
Ее легко запомнить, так что лучше выучить один раз, чем постоянно гуглить. Это здорово экономит время.
Имейте в виду, что я использую Google Colab, так что путь /content является абсолютным.
Проверка типа файла
Кроме прочего, модуль os.path содержит функции для проверки существования файла и для определения его типа:
Производите все манипуляции с файлами с осторожностью, придерживайтесь правила «семь раз отмерь — один раз отрежь». Не забывайте программно производить все возможные проверки перед выполнением операций.
Создание вложенных папок
Предположим, вы хотите создать не только одну папку, но и несколько вложенных:
Это создаст три папки рекурсивно, как показано на следующем изображении:
Сопутствующая статья - Python File
Используйте функцию shutil.move() для перемещения файлов в Python
Модуль shutil - это модуль Python, который помогает в высокоуровневых манипуляциях с файлами или набором файлов. Этот модуль используется в таких операциях, как копирование файла откуда-то или удаление файла.
Для перемещения файла из одного каталога в другой с помощью модуля shutil вызывается shutil.move() .
Здесь из модуля os используется функция listdir() , которая используется для получения полного списка всех файлов, находящихся в каталоге. Мы используем цикл for для перемещения файла и отмечаем, что функция move() модуля shutil используется для переноса файлов из одного каталога в другой.
Выводы
Перемещение файлов из одного каталога в другой может показаться не таким уж большим делом, но иногда это очень помогает при манипулировании файлами.
В этом руководстве будут представлены некоторые способы перемещения файлов из одного каталога в другой в Python.
Перемещение и переименование
Для удобной манипуляции с файлами и папками в стандартной библиотеки Python существует специальный модуль shutil . Функция shutil.move(source, destination) позволяет вам переместить любой файл или папку (даже непустую). Обратите внимание, что если destination — это уже существующая папка, то файл/папка будет перемещена внутрь неё, в остальных случаях файл/папка будут скопированы точно по нужному адресу. В случае успеха, функция вернёт новое местоположение файла. Если destination существует и не является папкой, то будет выброшена ошибка.
Как же переименовать файл? Несмотря на то, что os содержит специальную функцию для переименования, нужно понимать, что в рамках одной файловой системы перемещение и переименование — это одно и то же. Когда вы переименовываете файл, его содержимое не переписывается на носителе в другое место, просто файловая система теперь обозначает его положение другим путём.
Используйте функции os.rename() или os.replace() для перемещения файлов в Python
Часто пользователю необходимо подключиться к основной системе через Python. В этом случае в дело вступает модуль os . Модуль os в основном действует как посредник между пользователем и операционной системой компьютера, чтобы пользователь мог правильно подключиться к операционной системе.
Одна из функций этого модуля - модуль rename() , используемый для перемещения файлов из одного места в другое. Эта функция перемещает файлы, переименовывая имя каталога этих файлов.
Еще одна функция этого модуля - функция replace() . Эта функция помогает переименовать файл или текущий каталог. Местом назначения должен быть файл, а не каталог. Поэтому, если местом назначения является файл, он будет заменен без каких-либо ошибок.
В заключение, когда конечный пункт назначения файла находится на том же диске, что и исходный, используется функция rename() . А если нужно изменить место назначения файла, то нужно использовать replace() .
Здесь мы также следуем той же процедуре, сначала определяя пути к начальному и конечному каталогам. Затем мы используем функцию listdir() , чтобы получить список всех файлов в текущем каталоге. После этого мы используем цикл for , чтобы перезаписать место назначения этих файлов.
Удаление файлов и папок
Теперь пришел черед разобраться с процедурой удаления файлов и папок. Нам здесь снова поможет библиотека OS.
Когда нужно удалить файл, нужно воспользоваться командой os.remove():
Если требуется удалить каталог, на помощь приходит os.rmdir():
Однако он может удалить только пустой каталог. На приведенном выше скриншоте видим, что удалить можно лишь каталог level_3. Что если мы хотим рекурсивно удалить каталог level_1? В этом случае зовем на помощь shutil.
Функция shutil.rmtree() сделает все, что нужно:
Пользоваться ею нужно с осторожностью, поскольку она безвозвратно удаляет все содержимое каталога.
Собственно, на этом все. 8 важных операций по работе с файлами и каталогами в среде Python мы знаем. Что касается ссылки, о которой говорилось в анонсе, то вот она — это Google Colab Network с содержимым, готовым к запуску.
Модуль стандартной библиотеки os (от «operation system») предоставляет множество полезных функций для произведения системных вызовов. Одна из базовых функций этого модуля — os.listdir .
С точки зрения операционной системы нет разницы между файлом, папкой или другим подобным объектом, типа ссылки. Поэтому os.listdir() возвращает список как файлов, так и папок. Обратите внимание, что порядок элементов возвращаемого списка не регламентируется, если вам нужно их отсортировать не забудьте сделать это:
Модуль os содержит подмодуль os.path , который позволяет работать с путями файлов и папок. Импортировать этот модуль отдельно не нужно, достаточно выполнить import os .
Копирование
Скопировать файл можно с помощью функции shutil.copy(source, destination) . Правила расположения копии будут те же, что и при использовании shutil.move , за тем исключением, что если destination существует и не является файлом, то он будет заменён и ошибки это не вызовет.
Скопировать папку для операционной системы сложнее, ведь мы всегда хотим скопировать не только папку, но и её содержимое. Для копирования папок используйте shutil.copytree(source, destination) . Обратите внимание, что для этой функции destination всегда должно быть путём конечного расположения файлов и не может быть уже существующей папкой.
Список файлов и директорий
Функция os.listdir() возвращает список, который содержит имена файлов в папке. Если в качестве аргумента не указывать ничего, вернется список файлов и папок текущего рабочего каталога:
А что если нужно узнать состав и этих папок тоже? Для этого нужно использовать функцию os.walk() :
os.walk() — это генератор дерева каталогов. Он будет перебирать все переданные составляющие. Здесь в качестве аргумента передано значение «.», которое обозначает верхушку дерева:
Метод os.path.join() был использован для объединения текущего пути с именем файла/папки.
Перемещение файлов
Самое время попробовать переместить файлы из одной папки в другую. Рекомендованный способ — еще одна встроенная библиотека shutil.
Сейчас попробуем переместить все CSV-файлы из директории «sample_data» в директорию «test_dir». Ниже — пример кода для выполнения этой операции:
Кстати, есть два способа выполнить задуманное. Например, мы можем использовать библиотеку OS, если не хочется импортировать дополнительные библиотеки. Как os.rename, так и os.replace подходят для решения задачи.
Но обе они недостаточно «умные», чтобы позволить перемесить файлы в каталог.
Чтобы все это работало, нужно явно указать имя файла в месте назначения. Ниже — код, который это позволяет сделать:
Здесь функция os.path.basename () предназначена для извлечения имени файла из пути с любым количеством компонентов.
Другая функция, os.replace (), делает то же самое. Но разница в том, что os.replace () не зависит от платформы, тогда как os.rename () будет работать только в системе Unix / Linux.
Еще один минус — в том, что обе функции не поддерживают перемещение файлов из разных файловых систем, в отличие от shutil.
Поэтому я рекомендую использовать shutil.move () для перемещения файлов.
Создание файла
Нет ничего проще, чем создать пустой файл, достаточно открыть несуществующий файл с флагом 'x' :
Конечно, можно было бы использовать флаг 'w' , но тогда уже существующий файл был бы стёрт. С флагом 'x' open либо создаст новый файл, либо выбросит ошибку.
Присоединение одной части пути к другой
Работа с путями к файлам и папкам как с простыми строками чревата множеством ошибок и может создать проблемы при переносе программы между различными операционными системами. Правильный путь объединить две части пути — это использование os.path.join :
Удаление
Удалить файл можно с помощью функции os.remove , а пустую папку с помощью функции os.rmdir .
А вот для удаления папки с содержимым вновь понадобится shutil . Для удаления такой папки используйте shutil.rmtree .
Будьте осторожны, команды удаления стирают файл, а не перемещают его в корзину, вне зависимости от операционной системы! После такого удаления восстановить файл может быть сложно или вовсе невозможно.
- В текущей папке лежат файлы с расширениями .mp3 , .flac и .oga . Создайте папки mp3 , flac , oga и положите туда все файлы с соответствующими расширениями.
- В текущей папке лежит две других папки: vasya и mila , причём в этих папках могут лежать файлы с одинаковыми именами, например vasya/kursovaya.doc и mila/kursovaya.doc . Скопируйте все файлы из этих папок в текущую папку назвав их следующим образом: vasya_kursovaya.doc , mila_test.pdf и т.п.
- В текущей папке лежат файлы следующего вида: S01E01.mkv , S01E02.mkv , S02E01.mkv и т.п., то есть все файлы начинаются с S01 или S02 . Создайте папки S01 и S02 и переложите туда соответствующие файлы.
- В текущей папке лежат файлы вида 2019-03-08.jpg , 2019-04-01.jpg и т.п. Отсортируйте файлы по имени и переименуйте их в 1.jpg , 2.jpg , …, 10.jpg , и т.д.
- В текущей папке лежат две другие папки: video и sub . Создайте новую папку watch_me и переложите туда содержимое указанных папок (сами папки класть не надо).
- В текущей папке лежат файлы типа Nina_Stoletova.jpg , Misha_Perelman.jpg и т.п. Переименуйте их переставив имя и фамилию местами.
- В текущей папке лежит файл list.tsv , в котором с новой строки написаны имена некоторых других файлов этой папки. Создайте папку list и переложите в неё данные файлы.
Для тестирования вашей программы положите в репозиторий файлы и папки с соответствующими именами. Файлы должны быть пустыми, если не указано обратного.
Проверяем, существует файл или каталог
Прежде чем задействовать команду по созданию файла или каталога, стоит убедиться, что аналогичных элементов нет. Это поможет избежать ряда ошибок при работе приложения, включая перезапись существующих элементов с данными.
Функция os.path.exists () принимает аргумент строкового типа, который может быть либо именем каталога, либо файлом.
В случае с Google Colab при каждом запуске создается папка sample_data. Давайте проверим, существует ли такой каталог. Для этого подойдет следующий код:
Эта же команда подходит и для работы с файлами:
Если папки или файла нет, команда возвращает false.
Переименование файлов
С помощью модуля os достаточно просто переименовать файл. Поменяем название созданного в прошлом шаге.
Функция os.rename() принимает 2 аргумента: имя файла или папки, которые нужно переименовать и новое имя.
Извлечение имени файла из пути
Функция os.path.split совершает обратное действие — отрезает имя файла или ниже лежащей папки от пути:
Сопутствующая статья - Python Dictionary
report this ad
Python становится все популярнее благодаря относительной простоте изучения, универсальности и другим преимуществам. Правда, у начинающих разработчиков нередко возникают проблемы при работе с файлами и файловой системой. Просто потому, что они знают не все команды, которые нужно знать.
Эта статья предназначена как раз для начинающих разработчиков. В ней описаны 8 крайне важных команд для работы с файлами, папками и файловой системой в целом. Все примеры из этой статьи размещены в Google Colab Notebook (ссылка на ресурс — в конце статьи).
Объединение компонентов пути
В предыдущем примере я намеренно использовал слеш "/" для разделителя компонентов пути. В принципе это нормально, но не рекомендуется. Если вы хотите, чтобы ваше приложение было кроссплатформенным, такой вариант не подходит. Так, некоторые старые версии ОС Windows распознают только слеш "\" в качестве разделителя.
Но не переживайте, Python прекрасно решает эту проблему благодаря функции os.path.join (). Давайте перепишем вариант из примера в предыдущем пункте, используя эту функцию:
Получение информации о файлах
Для получения информации о файле в ОС используется функция os.stat() , которая выполняет системный вызов stat() по выбранному пути:
Это вернет кортеж с отдельными метриками. В их числе есть следующие:
- st_size — размер файла в байтах
- st_atime — время последнего доступа в секундах (временная метка)
- st_mtime — время последнего изменения
- st_ctime — в Windows это время создания файла, а в Linux — последнего изменения метаданных
Для получения конкретного атрибута нужно писать следующим образом:
На этой странице больше об атрибутах.
Копирование файлов
Аналогичным образом shutil подходит и для копирования файлов по уже упомянутым причинам.
Если нужно скопировать файл README.md из папки «sample_data» в папку «test_dir», поможет функция shutil.copy():
Перемещение файлов
Функцию os.replace() можно использовать для перемещения файлов или каталогов:
Стоит обратить внимание, что это перезапишет путь, поэтому если в папке folder уже есть файл с таким же именем ( renamed-text.txt ), он будет перезаписан.
Показываем содержимое директории
Еще одна полезная команда — os.listdir(). Она показывает все содержимое каталога.
Команда отличается от os.walk (), где последний рекурсивно показывает все, что находится «под» каталогом. os.listdir () намного проще в использовании, потому что просто возвращает список содержимого:
В некоторых случаях нужно что-то более продвинутое — например, поиск всех CSV-файлов в каталоге «sample_data». В этом случае самый простой способ — использовать встроенную библиотеку glob:
Удаление директорий
С помощью функции os.rmdir() можно удалить указанную папку:
Для удаления каталогов рекурсивно необходимо использовать os.removedirs() :
Это удалит только пустые каталоги.
Создание папки
Для создания папки/каталога в любой операционной системе нужна следующая команда:
После ее выполнения в текущем рабочем каталоге тут же появится новая папка с названием «folder».
Если запустить ее еще раз, будет вызвана ошибка FileExistsError , потому что такая папка уже есть. Для решения проблемы нужно запускать команду только в том случае, если каталога с таким же именем нет. Этого можно добиться следующим образом:
Функция os.path.isdir() вернет True , если переданное имя ссылается на существующий каталог.
Создание директории
Ну а теперь самое время создать директорию с именем test_dir внутри рабочей директории. Для этого можно использовать функцию
os.mkdir():
Давайте посмотрим, как это работает на практике.Если же мы попытаемся создать каталог, который уже существует, то получим исключение.
Именно поэтому рекомендуется всегда проверять наличие каталога с определенным названием перед созданием нового:
Еще один совет по созданию каталогов. Иногда нам нужно создать подкаталоги с уровнем вложенности 2 или более. Если мы все еще используем os.mkdir (), нам нужно будет сделать это несколько раз. В этом случае мы можем использовать os.makedirs (). Эта функция создаст все промежуточные каталоги так же, как флаг mkdir -p в системе Linux:
Вот что получается в результате.Используйте модуль pathlib для перемещения файлов в Python
Модуль pathlib в Python - это стандартный модуль, используемый для предоставления объекта, используемого для управления различными файлами и словарями. Основной объект для работы с файлами называется Путь.
Создание папки
Для создания новой папки используйте os.mkdir(name) . Эта функция выбросит ошибку, если по указанному пути уже существует файл или папка. Если вам нужно создать сразу несколько вложенных папок, то смотрите функцию os.makedirs(name, exist_ok=False) .
Читайте также: