Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Приложение 1 к уроку
Некоторые методы управления файловой системой библиотеки os Python
Сегодня разберём несколько методов библиотеки os, которые используются для выполнения основным операций в файловой системе. В том числе и те, о которых я говорил в видеоуроке 10.
А какие основные операции: создание каталога, удаление каталога или файла, переименование файла или каталога, просмотр списка файлов в каталоге. Это тот минимум, который обычно необходим для работы в файловой системе, с учётом возможностей встроенных в Python функций, являющихся методами объекта, получаемого с помощью open().
Замечание
Если та или иная команда os не может быть выполнена, то обычно возникает исключение, которое может быть перехвачено обычным способом через try-except.
Получение списка файлов
Обратимся к примеры из видеоурока 10.
Особенностью метода listdir() является то, что он читает всё содержимое каталога сразу и помещает его в список.
Куда интересней метод scandir()
Функция возвращает итератор, по которому можно пройти, получив все его элементы. Если итератор не пройден полностью, то рекомендуется его закрывать: scandir().close().
Но интересно то, что элементы итераторы это объекты, обладающие рядом свойств и методов. Как показано выше, одним из свойств является name, которое содержит имя элемента каталога. Есть также свойство path, содержащее полный путь к файлу, а также методы получение типа элемента (каталог, файл) . Мы не будем их здесь демонстрировать, так как библиотека os имеет в своём распоряжении более надёжные средства получения полной и актуальной информации об элементе списка каталога. И мы расскажем о них в следующем приложении к уроку.
Текущий каталог. Изменение текущего каталога средствами os
В таких операционных системах как Linux или Windows текущий каталог принято обозначать точкой '.'. При запуске программы текущий каталог запускающей системы (родительского процесса) становится текущим каталогом для запущенного процесса. Но текущий каталог можно изменить с помощью метода chdir().
В данной программе мы в начале меняем текущий каталог, а потом получаем список файлов с помощью listdir('.'). Получить путь к текущему каталогу можно с помощью метода os.getcwd().
Следует отметить, что по окончанию работы программы текущий каталог возвращается к своему исходному значению в родительском каталоге. Другими словами все изменения текущего каталога существуют только для исполняемого процесса.
Создание каталога средствами os
Если обыкновенный файл можно создать просто открыв его для записи, то для создания каталога можно использовать метод mkdir(). При создании каталога первым параметром идёт путь к каталогу. Но есть ещё и второй параметр, который определяет режим доступа к каталогу. Режимам доступа мы вынуждены будем посвятить отдельный урок, но по умолчанию пользователь от имени которого была запущена программа, будет являться владельцем каталога и обладать полными правами на него.
В программе создаётся указанный каталог (требуется указать путь к каталогу) и далее с помощью двух методов chdir() происходит переход в родительский каталог и выводится список элементов каталога. Из которого мы можем узнать был ли создан каталог.
Метод makedirs() позволяет создать целую цепочку вложенных каталогов. Например
os.makedirs('./abc/cab/bac/bca')
Удаление файлов и каталогов средствами os
Следует отметить, что файл в таких операционных системах как представлен так называемой жесткой ссылкой. Но жестких ссылок может быть несколько. Смысл удаления файла заключается в удалении жестких ссылок из каталогов. Сам файл остаётся "жить" пока существует хотя бы одна жесткая на него. Мягким и жёстким ссылкам также придётся посвятить отдельный урок, но идея, в принципе, должна быть понятна. Для удаления жесткой ссылки на файл используются методы os.unlink() или os.remove(). Аргументами методов являются пути к файлу. Подчеркнем, что попытка удаления с помощью этих методов каталогов приводит к исключению. Например
os.unlink('./list')
удаление жесткой ссылки на файл в текущем каталоге.
Для удаления пустого каталога используется метод rmdir(). При попытке удаления не пустого каталога возникает исключение, которое можно перехватывать известным нам способом.
Есть также метод removedirs(), которая, как пишут в документации удаляет каталоги рекурсивно. На самом деле это не так. Для метода указывается полный путь к последнему каталогу, который функция будет пытаться удалить и так далее двигаясь от одного родительского каталога к другому по цепочке. Но каждый удаляемы каталог должен быть при этом пуст. Так что настоящей рекурсии с обходом здесь, конечно, нет. Например
os.makedirs('./qwe/asd/vbn/uio/fgh/opi') # создать
os.removedirs('./qwe/asd/vbn/uio/fgh/opi') # удалить
Переименование файлов и каталогов средствами os
Переименование файлов и каталогов осуществляется методом rename(). При этом если для нового имени объекта указать другой путь, происходит перенос объекта в новый каталог.
#!/usr/bin/python3
import os
os.rename('./1', './2')
os.rename('./list', '/home/vladislav/list2')
В примере переименовывается каталог и переносится в другой каталог файл с изменением имени.
При переименовании каталога следует иметь в виду
- Заметим, что каталог переносится (если переносить) вместе с его содержимым.
- Если при переименовании каталога уже существует каталог с указанным именем, то метод выполняется без ошибки, если этот (конечный) каталог пуст.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.