Эта статья продолжает нашу серию рассказов о взаимодействии с файловой системой в Python. В предыдущих разговор шёл о чтении и записи файлов. Любопытно, что файловая система — это гораздо больше, чем способ сохранять/извлекать данные на диск или с диска. Также есть разные типы объектов, такие как файлы, директории, сокеты (для межпроцессного взаимодействия), именованные каналы (pipes), как мягкие (символьные), так и жёсткие ссылки, а также специальные файлы устройств. Запись и чтение в них или из них делается примерно так же, как мы видели в предыдущих статьях.
Эта статья посвящена работе с директориями. Другие операционные системы, такие как UNIX/Linux, используют другую терминологию, где “папка” именуется “каталогом”. Далее мы вам покажем, как определить текущую рабочую директорию, как создать постоянную и временную, одиночную и вложенные структуры с подкаталогами, и как удалить директорию, если она больше не нужна. Здесь в игру вступают два модуля Python: os
и tempfile
.
Оглавление
Требуемые модули Python
Чтение и запись файлов не нуждаются в загрузке дополнительных модулей, но для доступ к функциям файловой системы (таким как управление директориями) требуется, чтобы мы использовали отдельный модуль. Во-первых, нужно загрузить модуль os
. Он принадлежит к основной части экосистемы Python. Он подключается с помощью выражения:
import os
Модуль os
содержит большинство методов, которые нам понадобятся на протяжении этой статьи. Хотя, как будет видно позже, если вы хотите чего-то более продвинутого, такого как создать временный файл для хранения данных, то нам также будет нужен модуль tempfile
.
Определяем текущую рабочую директорию
Прежде чем мы возьмёмся за создание/удаление директорий, давайте посмотрим, как выполнять простейшие операции с директориями, например определять текущий рабочий каталог, используя метод getcwd()
. Этот метод вернёт строку, содержащую путь к вашей рабочей директории. Листинг 1 показывает, как интегрировать этот метод в скрипт на Python.
# импорт модуля os import os # определяем текущий каталог и печатаем path = os.getcwd() print ("Текущая рабочая директория %s" % path)
Листинг 1
Вывод должен выглядеть следующим образом:
$ python3 cwd.py Текущая рабочая директория /home/sergey/
Более того, модуль os
содержит дополнительный метод getcwdb()
. Он похож на методgetcwd()
, но в отличие от него нозвращает путь как двоичную строку.
Есть и некоторые другие операции с директориями, не затронутые в этой статье, такие как проверка наличия файла или каталога. Но сейчас перейдём к главной цели этой статьи.
Создание директории
Одиночная директория создаётся методом mkdir()
. В качестве параметра mkdir()
запрашивает путь к каталогу, чтобы создать его. Для примера рассмотрим код ниже:
import os # определим имя директории, которую создаём path = "/tmp/year" try: os.mkdir(path) except OSError: print ("Создать директорию %s не удалось" % path) else: print ("Успешно создана директория %s " % path)
Листинг 2
Имейте в виду, что метод mkdir()
не может создавать подкаталоги уровнем глубже первого за один вызов. Чтобы создать путь целиком, вам нужно вызвать mkdir()
один раз для каждого уровня. Иначе, если вы хотите создать множество каталогов за один раз, воспользуйтесь вместо этого методом makedirs()
(который вы можете увидеть в листинге 4 ниже).
В качестве вспомогательного параметра можно определить права доступа к директории внутри вызова mkdir()
. Настройки по умолчанию суть 777, это означает, что читать и писать могут хозяин, члены группы и все остальные пользователи. Если вам нужны более строгие настройки, такие как 755, (доступно для чтения всем пользователям, права на запись есть только у хозяина), вы можете вызвать его так:
import os # определим имя директории, которую создаём path = "/tmp/year" # define the access rights access_rights = 0o755 try: os.mkdir(path, access_rights) except OSError: print ("Создать директорию %s не удалось" % path) else: print ("Успешно создана директория %s" % path)
Листинг 3
Вы могли заметить, что права доступа (в данном сдучае 755) определены через восьмеричный префикс (0o
), так что вам не придётся переводить число в десятичный формат. Поскольку операционная система представляет права доступа в восьмеричном виде, мы их представим так же.
Хотя, как гласит документация Python, некоторые системы игнорируют параметр mode
, вместо него следует использовать os.chmod
.
Создание директории с подкаталогами
Как уже было упомянуто выше, метод mkdir()
позволяет нам создать только одиночную директорию. Чтобы создать многоуровневые подкаталоги, приходит на помощь метод makedirs()
. В самом деле, makedirs()
имплементируется так, что он вызывает mkdir()
, чтобы создавать директории одну за другой.
В качестве параметра makedirs()
принимает путь целиком. Этот метод схож с командой UNIX/Linux mkdir -p
. Листинг 4 показывает пример того, как его применять.
import os # определим имя директории, которую создаём path = "/tmp/year/month/week/day" try: os.makedirs(path) except OSError: print ("Создать директорию %s не удалось" % path) else: print ("Успешно создана директория %s" % path)
Листинг 3
Созддание временной директории
До сих пор мы создавали постоянные элементы в файловой системе. По разным причинам, таким как временное хранение данных, может понадобиться иметь временный каталог. Модуль tempfile
содержит методы, обрабатывающие подобые случаи безопасным и последовательным способом.
Листинг 5 показывает пример того, как используется метод TemporaryDirectory()
в комбинации с выражением with
. После with
временная директория больше не существует, потому что и каталог, и его содержимое полностью удалены.
import tempfile # создаём временную директорию with tempfile.TemporaryDirectory() as directory: print('Создана временная директория %s' % directory) # каталог и его содержимое удалены
Листинг 5
Листинг 6 показывает вывод скрипта на Python из листинга 5. Чтобы создать временные файлы, в системах UNIX/Linux выбираются три директории /tmp, /var/tmp и /usr/tmp, и берётся первый подходящий каталог. В данном случае использутся /tmp.
$ python3 mkdir-temporary.py Создана временная директория /tmp/tmpf6o0hy3c
Листинг 6
(в вашем случае, скорее всего, каталог будет называться по-другому – примечание)
Удаление директории
Это операция, противоположная её созданию. Вы можете это сделать, используя метод rmdir()
из модуля os
. rmdir()
запрашивает путь в виде строки, содержащей имя каталога, и удаляет только самый глубокий элемент в строке пути. Заметьте, что это работает лишь тогда, когда директория совершенно пуста. Если же она не пуста, возбуждается исключение OSError
. Листинг 7 показывает соответствующий код на Python.
import os # определим имя директории, которую удаляем path = "/tmp/year" try: os.rmdir(path) except OSError: print ("Удалить директорию %s не удалось" % path) else: print ("Успешно удалена директория %s" % path)
Листинг 7
В случае, когда вы хотите удалить целое дерево каталогов, метод rmtree()
из модуля shutil
поможет вам в этом.
Вывод
Как вы уже моли заметить, работа с директориями в Python очень проста. От вас требуется лишь несколько строк кода, чтобы создать или удалить этот тип файловых объектов.
Хорошо написано. Узнал дополнительные новые возможности.
mkdir(path, mode=0o777, *, dir_fd=None)
Не понятно назначение последнего параметра dir_fd