о понятии текущего рабочего каталога и его связи с операцией импортирования модулей, когда мы будем изучать контекст выполнения сценария.
Константы переносимости
Модуль os экспортирует также ряд имен, упрощающих программирование для нескольких платформ. В этот набор входят специфические для платформ настройки символов-разделителей компонентов путей и каталогов, указателей на родительский и текущий каталоги и символов, используемых для завершения строк в используемой системе:
>>> os.pathsep, os.sep, os.pardir, os.curdir, os.linesep
(‘;’, ‘\\’, ‘..’, ‘.’, ‘\r\n’)
Константа os.sep определяет символ, который используется в качестве разделителя компонентов пути к каталогу на платформе, где выполняется Python. Она автоматически получает значение \ в Windows, / -в POSIX-совместимых системах и : - в некоторых версиях Mac. Аналогично константа os.pathsep определяет символ, отделяющий каталоги в списках каталогов. Она получает значение : в POSIX-совместимых системах и ; - в DOS и Windows.
Использование таких атрибутов для составления и разбора относящихся к системе строк делает сценарии полностью переносимыми. Например, вызов вида dirpath.split(os.sep) правильно разберет на составляющие специфические для платформы имена каталогов, даже если dirpath выглядит как dir\dir в Windows, dir/dir в Linux и dir:dir в некоторых версиях на Mac. Как уже говорилось выше, при определении имен открываемых файлов в Windows допускается использовать символы прямого слеша вместо символов обратного слеша, но применение этих констант обеспечивает независимость программного кода, реализующего операции с каталогами, от платформы, на которой он выполняется.
Обратите также внимание, что функция os.linesep в примере выше возвращает последовательность символов \r\n - экранированные последовательности, соответствующие комбинации символов возврата каретки и перевода строки, которая в Windows используется как признак конца строки и на которую обычно никто не обращает внимания при обработке текстовых файлов в Python. Подробнее о преобразовании символов конца строки будет рассказываться в главе 4.
Основные инструменты os.path
Вложенный модуль os.path предоставляет большой набор собственных средств для работы с каталогами. Например, в него входят переносимые функции для таких задач, как проверка типа файла (isdir, isfile и другие), подтверждение существования файла (exists) и получение размера файла по его имени (getsize):
>>> os.path.isdir(r'C:\Users'), os.path.isfile(r'C:\Users')
(True, False)
>>> os.path.isdir(r'C:\config.sys'), os.path.isfile(r'C:\config.sys')
(False, True)
>>> os.path.isdir('nonesuch'), os.path.isfile('nonesuch')
(False, False)
>>> os.path.exists(r'c:\Users\Brian')
False
>>> os.path.exists(r'c:\Users\Default')
True
>>> os.path.getsize(r'C:\autoexec.bat')
24
Функции os.path.isdir и os.path.isfile сообщают нам о том, является ли имя файла каталогом или простым файлом; обе они возвращают False, если указанный файл не существует (то есть отсутствие файла предполагает отрицание). Есть также функции для разбиения или объединения строк путей к каталогам, которые автоматически используют соглашения об именовании каталогов для той платформы, где работает Python:
>>> os.path.split(r'C:\temp\data.txt')
(‘C:\\temp’, ‘data.txt’)
>>> os.path.join(r'C:\temp', 'output.txt')
‘C:\\temp\\output.txt’
>>> name = r'C:\temp\data.txt' # пути в Windows
>>> os.path.dirname(name), os.path.basename(name)
(‘C:\\temp’, ‘data.txt’)
>>> name = '/home/lutz/temp/data.txt' # пути в стиле Unix
>>> os.path.dirname(name), os.path.basename(name)
(‘/home/lutz/temp’, ‘data.txt’)
>>> os.path.splitext(r'C:\PP4thEd\Examples\PP4E\PyDemos.pyw')
(‘C:\\PP4thEd\\Examples\\PP4E\\PyDemos’, ‘.pyw’)
Функция os.path.split отделяет имя файла от пути к его каталогу, a os.path.join снова соединяет их вместе, и все это - совершенно переносимым образом, с использованием соглашений по оформлению путей, действующих в той системе, где они вызываются. Функции dirname и base-name возвращают первый и второй элементы, возвращаемые функцией split, и реализованы просто для удобства, a функция splitext отделяет расширение файла (за последним символом ). Тонкое замечание: эти функции по своему действию почти эквивалентны строковым методам split и join, если вызывать их относительно строковой константы os.sep. Почти, но не совсем:
>>> os.sep
‘\\’
>>> pathname = r'C:\PP4thEd\Examples\PP4E\PyDemos.pyw'
>>> os.path.split(pathname) # отделить имя файла от каталога
(‘C:\\PP4thEd\\Examples\\PP4E’, ‘PyDemos.pyw’)
>>> pathname.split(os.sep) # разбить путь по символам слеша
[‘C:’, ‘PP4thEd’, ‘Examples’, ‘PP4E’, ‘PyDemos.pyw’]
>>> os.sep.join(pathname.split(os.sep))
‘C:\\PP4thEd\\Examples\\PP4E\\PyDemos.pyw’