На этом шаге мы рассмотрим функции, выполняющие эти опрерации.
Преобразовать путь к файлу или каталогу позволяют следующие функции из модуля os.path:
>>> import os.path >>> os.path.abspath (r"file.txt") 'C:\\Python34\\file.txt' >>> os.path.abspath(r"folderl/file.txt") 'C:\\Python34\\folderl\\file.txt' >>> os.path.abspath (r"../file.txt") 'C:\\file.txt'
Как уже отмечалось ранее, в относительном пути можно указать как прямые, так и обратные слеши. Все они будут автоматически преобразованы с учетом значения атрибута sep из модуля os.path. Значение этого атрибута зависит от используемой операционной системы. Выведем значение атрибута sep в операционной системе Windows:
>>> os.path.sep
'\\'
При указании пути в Windows следует учитывать, что слеш является специальным символом. По этой причине слеш необходимо удваивать (экранировать) или вместо обычных строк использовать неформатированные строки. Пример:
>>> "C:\\temp\\new\\file.txt" # Правильно 'C:\\temp\\new\\file.txt' >>> r"C:\temp\new\file.txt" # Правильно 'C:\\temp\\new\\file.txt' >>> "C:\temp\new\file.txt" # Неправильно!!! 'C:\temp\new\x0cile.txt'
Кроме того, если слеш расположен в конце строки, то его необходимо удваивать даже при использовании неформатированных строк:
>>> r"C:\temp\new\" # Неправильно!!! SyntaxError: EOL whilescanning string literal >>> r"C:\temp\new\\" 'C:\\temp\\new\\\\'
В первом случае последний слеш экранирует закрывающую кавычку, что приводит к синтаксической ошибке. Решить эту проблему можно, удвоив последний слеш. Однако посмотрите на результат. Два слеша превратились в четыре. От одной проблемы ушли, а к другой пришли. Поэтому в данном случае лучше использовать обычные строки:
>>> "C:\\temp\\new\\" # Правильно 'C:\\temp\\new\\' >>> r"C:\temp\new\\"[:-1] # Можно и удалить слеш 'C:\\temp\\new\\'
>>> os.path.isabs (r"C: \book\file.txt") True >>> os.path.isabs ("file.txt") False
>>> os.path.basename (r"C:\book\folderl\file.txt") 'file.txt' >>> os.path.basename (r"C:\book\folder") 'folder' >>> os.path.basename ("С:\\book\\folder\\") ''
>>> os.path.dirname (r"C:\book\folder\file.txt") 'C:\\book\\folder' >>> os.path.dirname (r"C:\book\folder") 'C:\\book' >>> os.path.dirname ("C:\\book\\folder\\") 'C:\\book\\folder'
>>> os.path.split (r"C:\book\folder\file.txt") ('C:\\book\\folder', 'file.txt') >>> os.path.split (r"C:\book\folder") ('C:\\book', 'folder') >>> os.path.split ("C:\\book\\folder\\") ('C:\\book\\folder', '')
>>> os.path.splitdrive (r"C:\book\folder\file.txt") ('C:', '\\book\\folder\\file.txt')
>>> os.path.splitext (r"C:\book\folder\file.tar.gz") ('C:\\book\\folder\\file.tar', '.gz')
>>> os.path.join ("C:\\", "book\\folder", "file.txt") 'C:\\book\\folder\\file.txt' >>> os.path.join (r"C:\\", "book/folder/", "file.txt") 'C:\\\\book/folder/file.txt'
Обратите внимание на последний пример - в пути используются разные слеши, и в результате получен некорректный путь. Чтобы этот путь сделать корректным, необходимо воспользоваться функцией normpath():
>>> p = os.path.join (r"C:\\", "book/folder/", "file.txt") >>> os.path.normpath (p) 'C:\\book\\folder\\file.txt'
На следующем шаге мы рассмотрим перенаправление ввода/вывода.