Статьи

Операции с файлами и каталогами с использованием Python

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

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

Готов? Тогда давайте перейдем к сути и начнем делать интересные вещи с нашими файлами и каталогами, используя Python!

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

Визуализация того, каково это копировать каталоги в Python

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