Автор оригинала: 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 очень проста. Вам потребуется всего несколько строк кода, чтобы создать и удалить такую запись файла.
Ссылки и ссылки
- Проект документации Linux (LDP), Общий обзор файловой системы Linux Файлы
Признание
Автор хотел бы поблагодарить Золеку Хатитонгве за ее поддержку при подготовке статьи.