Выбрать главу

о понятии текущего рабочего каталога и его связи с операцией импортирования модулей, когда мы будем изучать контекст выполнения сценария.

Константы переносимости

Модуль 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’