Эта статья продолжает нашу серию статей о взаимодействии с файловой системой в 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
содержит дополнительный getcwdb()
. Этот метод похож
на метод 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()
принимает весь создаваемый путь. Этот
метод аналогичен команде mkdir -p
в UNIX / Linux. В листинге 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 показан пример использования TemporaryDirectory()
в
сочетании with
оператором 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 (TLDP), Общий обзор Linux
Файловая система , Файлы
Благодарности
Автор благодарит Золеку Хатитонгве за поддержку при подготовке статьи.