Вложенный модуль 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 и basename возвращают первый и второй элементы, возвращаемые функцией 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’
>>> os.path.join(*pathname.split(os.sep))
‘C:PP4thEd\\Examples\\PP4E\\PyDemos.pyw’
Последний вызов join требует передачи отдельных аргументов (отсюда и символ *), но он не вставляет первый символ слеша после буквы, обозначающей имя диска в Windows. Если подобные отличия имеют большое значение, используйте предшествующий вызов метода str. join. Функция normpath может пригодиться в ситуациях, когда в путях произвольно смешиваются разделители компонентов пути для Unix и Windows:
>>> mixed
‘C:\\temp\\public/files/index.html’
>>> os.path.normpath(mixed)
‘C:\\temp\\public\\files\\index.html’
>>> print(os.path.normpath(r’C:\temp\\sub\.\file.ext’))
C:\temp\sub\file.ext
В этом модуле имеется также функция abspath, которая переносимым образом возвращает полное имя файла. Она учитывает добавленный текущий каталог, родительский каталог .. и многое другое:
>>> os.chdir(r’C:\Users’)
>>> os.getcwd()
‘C:\\Users’
> >> os.path.abspath(‘’) # пустая строка означает тек. раб. каталог (cwd) ‘C:\\Users’
> >> os.path.abspath(‘temp’) # расширяет до полного пути к файлу в тек. кат. ‘C:\\Users\\temp’
> >> os.path.abspath(r’PP4E\dev’) # частичный путь относительно тек. раб. кат. ‘C:\\Users\\PP4E\\dev’
>>> os.path.abspath(‘.’) # расширяет относительные пути ‘C:\\Users’
>>> os.path.abspath(‘..’)
>>> os.path.abspath(r’..\examples’)
‘C:\\examples’
> >> os.path.abspath(r’C:\PP4thEd\chapters’) # абсолютные пути не изменяются ‘C:\\PP4thEd\\chapters’
>>> os.path.abspath(r’C:\temp\spam.txt’)
‘C:\\temp\\spam.txt’
Поскольку имена файлов считаются относящимися к текущему рабочему каталогу, если не заданы полными путями, функция os.path.ab— spath может пригодиться, если потребуется показать пользователю, какой каталог используется в действительности для сохранения файла. В Windows, например, при запуске программ с графическим интерфейсом щелчком на ярлыках в проводнике или на рабочем столе рабочим каталогом программы является тот, в котором находится запускаемый файл, что не всегда очевидно пользователю. В таких случаях может помочь вывод значения, возвращаемого функцией abspath для файла.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011