Рубрики
Без рубрики

Создание и удаление каталогов с помощью Python

Автор оригинала: Frank Hofmann.

Создание и удаление каталогов с помощью Python

Эта статья продолжает нашу серию статей о взаимодействии с файловой системой в Python. Предыдущие статьи касались чтения и записи файлов. Интересно, что файловая система-это гораздо больше, чем способ хранения/извлечения данных на диск. Существуют также различные другие типы записей, такие как файлы, каталоги, сокеты (для межпроцессной связи), именованные каналы, как мягкие, так и жесткие ссылки, а также специальные файлы (блочные устройства). Чтение и запись от них и к ним осуществляется таким же образом, как мы видели в предыдущих статьях.

Эта статья посвящена обработке каталогов. Другие операционные системы, такие как UNIX/Linux, вместо этого используют другую терминологию, где “запись” называется “папкой”. Далее мы покажем вам, как определить текущий рабочий каталог, как создать как постоянный, так и временный единый каталог, а также вложенные структуры каталогов с подпапками и как удалить каталог, если он больше не нужен. Поэтому в игру вступают два модуля Python os и tempfile .

Необходимые модули Python

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

import os

Модуль os содержит большинство методов, которые нам понадобятся в этой статье. Однако, как вы увидите позже, если вы хотите что-то более продвинутое, например создать временный файл для хранения данных, то нам также понадобится модуль tempfile .

Обнаружение текущего рабочего каталога

Прежде чем мы перейдем к созданию/удалению каталогов, давайте посмотрим, как выполнить некоторые другие основные операции с каталогами, такие как обнаружение текущего рабочего каталога с помощью метода getcwd() . Этот метод вернет строку, содержащую путь к вашему рабочему каталогу. Листинг 1 показывает, как интегрировать этот метод в скрипт Python.

# import the os module
import os

# detect the current working directory and print it
path = os.getcwd()
print ("The current working directory is %s" % path)

Листинг 1

Вывод должен выглядеть примерно так:

$ python3 cwd.py
The current working directory is /home/frank/

Кроме того, модуль os содержит дополнительный метод getcwd () . Этот метод похож на метод getcwd () , но вместо этого возвращает путь в виде двоичной строки.

Существует довольно много других операций с каталогами, не описанных в этой статье, например проверка наличия файла или каталога . Но сейчас мы перейдем к основной цели этой статьи.

Создание каталога

Создание единого каталога выполняется с помощью метода mkdir () . В качестве параметра mkdir() сначала требуется путь к каталогу, чтобы он был создан. Пример см. в приведенном ниже коде:

import os

# define the name of the directory to be created
path = "/tmp/year"

try:
    os.mkdir(path)
except OSError:
    print ("Creation of the directory %s failed" % path)
else:
    print ("Successfully created the directory %s " % path)

Листинг 2

Имейте в виду, что метод mkdir() не может создавать подкаталоги на более глубоком уровне, чем один в одном вызове. Чтобы создать полный путь, вы должны вызвать mkdir() один раз на уровне каталога. В качестве альтернативы, если вы хотите создать несколько каталогов одновременно, используйте вместо этого метод makedirs () (который вы можете увидеть в Листинге 4 ниже).

В качестве необязательного параметра вы можете указать права доступа к каталогу в вашем вызове mkdir () . Значение по умолчанию-777, что означает, что он доступен для чтения и записи владельцем, членами группы и всеми другими пользователями. Если вам требуется более ограничительный параметр, например 755 (читаемый и доступный всем пользователям, а доступ на запись-только владельцу), вы можете вызвать его следующим образом:

import os

# define the name of the directory to be created
path = "/tmp/year"

# define the access rights
access_rights = 0o755

try:
    os.mkdir(path, access_rights)
except OSError:
    print ("Creation of the directory %s failed" % path)
else:
    print ("Successfully created the directory %s" % path)

Листинг 3

Одно замечание об этом коде – вы, возможно, заметили, что права доступа (здесь 755) задаются с помощью восьмеричного префикса ( 0o ), что делается для того, чтобы вам не нужно было сначала преобразовывать число в десятичное. Поскольку ОС представляет права доступа как восьмеричные, именно так мы будем представлять их и здесь.

Однако, как говорится в документации Python , некоторые системы игнорируют параметр mode , и вместо него следует использовать os.chmod .

Создание каталога с подкаталогами

Как уже упоминалось выше, метод mkdir() позволяет нам создать только один каталог. Для создания многоуровневых подкаталогов в игру вступает метод makedirs () . На самом деле, makedirs() реализован таким образом, что он вызывает mkdir() для создания одного каталога за другим.

В качестве параметра makedirs() принимает весь создаваемый путь. Этот метод аналогичен команде UNIX/Linux mkdir-p . Листинг 4 показывает пример использования этого метода.

import os

# define the name of the directory to be created
path = "/tmp/year/month/week/day"

try:
    os.makedirs(path)
except OSError:
    print ("Creation of the directory %s failed" % path)
else:
    print ("Successfully created the directory %s" % path)

Листинг 3

Создание временного каталога

До сих пор мы создавали постоянные записи в файловой системе. По разным причинам, таким как временная парковка данных, может быть необходимо просто иметь временный каталог. Модуль tempfile содержит методы, которые обрабатывают такие случаи безопасным и последовательным образом.

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

import tempfile

# create a temporary directory
with tempfile.TemporaryDirectory() as directory:
    print('The created temporary directory is %s' % directory)

# directory and its contents have been removed by this point

Листинг 5

Листинг 6 показывает выходные данные скрипта Python из Листинга 5 . Чтобы создать временные файлы, в системах UNIX/Linux пробуются три каталога/tmp,/var/tmp и/usr/tmp, и берется первое совпадение из них. В данном случае используется каталог/tmp.

$ python3 mkdir-temporary.py
The created temporary directory is /tmp/tmpf6o0hy3c

Листинг 6

Удаление каталога

Удаление каталога – это противоположный случай его создания. Это можно сделать с помощью метода rmdir() модуля os . rmdir() требует строку пути, содержащую имя каталога, и удаляет только самую глубокую запись в строке пути. Обратите внимание, что это работает только тогда, когда каталог полностью пуст. Если он не пуст, то возникает OSError . Листинг 7 показывает соответствующий код Python.

import os

# define the name of the directory to be deleted
path = "/tmp/year"

try:
    os.rmdir(path)
except OSError:
    print ("Deletion of the directory %s failed" % path)
else:
    print ("Successfully deleted the directory %s" % path)

Листинг 7

В случае, если вы хотите удалить целое дерево каталогов, метод rmtree() из модуля shutil поможет вам в этой задаче.

Вывод

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

Ссылки и ссылки

Признание

Автор хотел бы поблагодарить Золеку Хатитонгве за ее поддержку при подготовке статьи.