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

Эта статья продолжает нашу серию статей о взаимодействии с файловой системой в Python. Предыдущие статьи касались чтения [/ read-files-with-python] и записи файлов [/ writing-files-using-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 содержит дополнительный 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 очень просто. Для создания и удаления такой записи файла требуется всего несколько строк кода.

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

Благодарности

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

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus