На этом шаге мы начнем рассматривать эти функции.
Для работы с каталогами используются следующие функции из модуля os:
>>> import os >>> os.getcwd () # Текущий рабочий каталог 'C:\\Python34'
>>> os.chdir("C:\\book\\folder1\\") >>> os.getcwd () # Текущий рабочий каталог 'C:\\book\\folder1'
>>> os.mkdir ("newfolder") # Создание каталога
>>> os.rmdir ("newfolder") # Удаление каталога
>>> os.listdir ("C:\\book\\folder1\\") ['file1.txt', 'file2.txt', 'file3.txt', 'folder1', 'folder2']
walk(<Начальный каталог>[, topdown=True][, onerror=None] [, followlinks=False])
Если произвести изменения в списке каталогов во время выполнения, это позволит изменить порядок обхода вложенных каталогов.
Необязательный параметр topdown задает последовательность обхода каталогов. Если в качестве значения указано True (значение по умолчанию), то последовательность обхода будет такой (вглубь, по-порядку, до тех пор, пока можно двигаться):
>>> for (p, d, f) in os.walk("C:\\book\\folder1\\"): print (p) C:\book\folder1\ C:\book\folder1\folder1_1 C:\book\folder1\folder1_1\folder1_1_1 C:\book\folder1\folder1_1\folder1_1_2 C:\book\folder1\folder1_2
>>> for (p, d, f) in os.walk("C:\\book\\folder1\\", False): print (p) C:\book\folder1\folder1_1\folder1_1_1 C:\book\folder1\folder1_1\folder1_1_2 C:\book\folder1\folder1_1 C:\book\folder1\folder1_2 C:\book\folder1\
Благодаря такой последовательности обхода каталогов можно удалить все вложенные файлы и каталоги. Это особенно важно при удалении каталога, т. к. функция rmdir () позволяет удалить только пустой каталог. Пример очистки дерева каталогов:
import os for (p, d, f) in os.walk("C:\\book\\folder1\\", False): for file_name in f: # Удаляем все файлы os.remove(os.path.join(p, file_name)) for dir_name in d: # Удаляем все каталоги os.rmdir(os.path.join(p, dir_name))
В заключение несколько слов в отношении двух других параметров функции walk().
По умолчанию созникающие ошибки при выполнении walk() игнорируются. Если задан дополнительный аргумент onerror, то он должен быть функцией. Оно будет вызываться с одним аргументом, экземпляром OSError. Назначение этой функции может быть различным. Она может сообщить об ошибке и продолжить выполнение walk() или возбудить исключение, чтобы прервать выполнение walk(). Обратите внимание, что имя файла доступно как атрибут filename объекта исключения.
По умолчанию walk() игнорирует символические ссылки (ярлыки), которые указывают на каталоги. Можно установить значение параметра followlinks в True, чтобы просмотреть каталоги, на которые указывают символические ссылки (ярлыки).
Удалить дерево каталогов позволяет также функция rmtree() из модуля shutil. Функция имеет следующий формат:
rmtree (<Путь>[, <Обработка ошибок>[, <Обработчик ошибок>]])
Если в параметре <Обработка ошибок> указано значение True, то ошибки будут проигнорированы. Если указано значение False (значение по умолчанию), то в третьем параметре можно указать ссылку на функцию-обработчик. Эта функция будет вызываться при возникновении исключения. Пример удаления дерева каталогов вместе с начальным каталогом:
>>> import shutil >>> shutil.rmtree ("C:\\book\\folder1\\")
>>> from os.path import normcase >>> normcase (r"C:/BoOk/fILe.TxT") 'c:\\book\\file.txt'
На следующем шаге мы закончим изучение этого вопроса.