В предыдущем уроке я обсуждал, как мы можем читать, открывать, закрывать и записывать в файлы. В этом уроке я пойду дальше и рассмотрю различные операции, которые мы можем выполнять над файлами и каталогами (папками).
Вы знаете, например, что мы часто используем файлы, и работа с файлами выходит за рамки простого открытия и закрытия файла. Вы помните, сколько раз вы копировали этот конкретный файл? О, или когда вы переименовали файл, который вы скачали с какого-то сайта, потому что он имел бессмысленное имя? Вот некоторые типы операций, которые я собираюсь обсудить в этом уроке.
Готов? Тогда давайте перейдем к сути и начнем делать интересные вещи с нашими файлами и каталогами, используя Python!
shutil
shutil
(Shell Utilities) — это название модуля, который мы будем использовать в этом руководстве для выполнения различных операций с файлами и каталогами. shutil
уже поставляется с вашей установкой Python, поэтому вам не нужно устанавливать его вручную. Чтобы использовать этот модуль, все, что вам нужно сделать, это import
модуль:
import shutil
Копирование файлов
Давайте начнем с нашей первой операции, то есть копирования файлов . Для этого мы будем использовать функцию copy()
из модуля shutil
. Я собираюсь использовать файл sample.pdf в примерах этого урока. Вы можете свободно загружать этот файл или использовать любой файл, который вам нравится.
Следующий простой скрипт покажет вам, как скопировать sample.pdf
с рабочего стола (где он изначально находится) в другой каталог Temp
, который также находится на рабочем столе:
1
2
|
import shutil
shutil.copy(‘sample.pdf’, ‘Temp’)
|
Обратите внимание, что я указал только имя файла и имя каталога, так как я работаю с моим терминалом, а рабочий стол — это путь, который я использую. Вместо этого вы можете указать полный путь как к файлу, который вы хотите скопировать, так и к каталогу, в который вы хотите скопировать файл, что в моем случае выглядит следующим образом:
1
|
shutil.copy(‘/Users/Abder/Desktop/sample.pdf’, ‘/Users/Abder/Desktop/Temp’)
|
Продолжайте, откройте каталог Temp
или любой указанный вами каталог, и вы должны найти скопированный файл там!
Что, если вторым аргументом был файл, а не каталог? Другими словами, допустим, вы ввели следующее (я удалил полный путь к файлам, предполагая, что они оба на рабочем столе):
1
2
|
import shutil
shutil.copy(‘sample.pdf’, ‘file.pdf’)
|
В этом случае у вас будет новый файл file.pdf
, который является копией исходного файла sample.pdf
. Таким образом, если вы откроете file.pdf
, вы заметите, что он имеет тот же контент, потому что он на самом деле является копией sample.pdf
.
Может ли источник и пункт назначения быть одинаковыми? Давайте попробуем и посмотрим.
shutil.copy('sample.pdf', 'sample.pdf'
)
Кажется, что эта операция принесет нам ошибку, поскольку имена файлов не должны совпадать:
1
2
3
4
5
6
7
8
|
Traceback (most recent call last):
File «test.py», line 2, in <module>
shutil.copy(‘sample.pdf’, ‘sample.pdf’)
File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py», line 119, in copy
copyfile(src, dst)
File «/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py», line 69, in copyfile
raise Error(«`%s` and `%s` are the same file» % (src, dst))
shutil.Error: `sample.pdf` and `sample.pdf` are the same file
|
Копирование каталогов
В этом разделе мы увидим, как мы можем скопировать весь каталог (папку), а не один файл, как мы видели в предыдущем разделе.
Допустим, у нас есть следующая структура каталогов, которую мы хотим скопировать. То есть у нас есть главный каталог Original
, который содержит каталог Original-1
, который содержит каталог Original-2
, и который содержит каталог Original-3
, а в Original-3
у нас есть файл Sample.pdf
(phew. ..).
Теперь мы хотим скопировать каталог Original
со всем его содержимым в новый каталог и вызвать этот новый каталог Original-Copy
.
Это можно просто сделать с помощью функции copytree()
следующим образом (при условии, что все происходит на рабочем столе):
1
2
|
import shutil
shutil.copytree(‘Original’, ‘Original-Copy’)
|
Теперь вы должны найти новый каталог Original-Copy
со всем содержимым и структурой Original
.
Перемещение файлов
Перемещение файла похоже на выполнение операции вырезания и вставки файла. В разделе « Копирование файлов » мы увидели, как сделать копию файла, сохранив при этом исходный файл.
В этом разделе мы увидим, как переместить (вырезать) файл в новое место, одновременно удаляя его из исходного положения. Эта операция просто выполняется с помощью функции move()
следующим образом:
1
2
|
import shutil
shutil.move(‘Sample.pdf’, ‘Temp’)
|
Обратите внимание, что Sample.pdf
был перемещен в каталог Temp
и больше не существует на рабочем столе.
Что если мы переместим Sample.pdf
в новый файл New-Sample.pdf
следующим образом?
1
2
|
import shutil
shutil.move(‘Sample.pdf’, ‘New-Sample.pdf’)
|
В этом случае у вас будет только New-Sample.pdf
с тем же содержимым, что и Sample.pdf
, но Sample.pdf
больше не существует.
Перемещение каталогов
Перемещение каталогов выполняется с помощью той же функции, которую мы использовали в разделе « Перемещение файлов », а именно move()
. Давайте использовать тот же пример, что и в разделе « Копирование каталогов », но теперь с функцией move()
.
1
2
|
import shutil
shutil.move(‘Original’, ‘Original-Copy’)
|
В этом случае у вас будет новый каталог Original-Copy
с тем же содержимым, что и Original
, но Original
больше не существует.
Переименование файлов и каталогов
Угадай, что? Вы также можете использовать функцию move()
для переименования файла или каталога. Я не буду повторять примеры снова в этом разделе. Но, если вы заметили, что при применении функции move()
к файлам и каталогам выше, мы упоминали, что исходный файл / каталог больше не существует, но существует новый файл / каталог с тем же содержимым. Это похоже на переименование файла / каталога, не так ли?
Удаление файлов и каталогов
Кажется, что модуль shutil
не содержит функции для удаления файлов . Однако он содержит функцию для удаления каталогов: rmtree()
. Будьте осторожны, так как удаление является постоянным, и, таким образом, вы не найдете удаленный каталог в корзине.
Пример ниже показывает, как мы можем навсегда удалить каталог Original-Copy
:
1
2
|
import shutil
shutil.rmtree(‘Original-Copy’)
|
Если вы хотите окончательно удалить файл , вы можете использовать функцию remove()
из модуля Python os
следующим образом:
1
2
|
import os
os.remove(‘Sample.pdf’)
|
Вывод
Как видите, мы смогли очень легко выполнять важные операции с файлами и каталогами — копировать, перемещать, переименовывать и удалять — с помощью модулей shutil и os . Вы можете обратиться к документации этих модулей для получения дополнительной информации о том, что вы можете с ними сделать.