Представление пути в Python

Вот почему вам следует избегать представления путей в виде строк и вместо этого использовать Pathlib.

Работа с файловыми системами — одна из самых тривиальных задач в программировании. Удивительно, но многие из нас до сих пор ошибаются, поскольку мы склонны представлять пути к файлам в виде строк. Это в корне неверно и является одним из самых распространенных антипаттернов, который вы наверняка уже видели во многих разных репозиториях Python.

В сегодняшней статье мы обсудим, почему использовать строки (или даже модуль os) для представления путей в файловых системах — плохая идея. Кроме того, мы обсудим лучшие практики и посмотрим на практике, как использовать пакет pathlib для правильного кодирования путей к файлам в Python. Давайте начнем!

Почему использование строк для представления путей — плохая идея

Разные операционные системы используют разные соглашения об именах, когда речь идет о представлении путей в их файловых системах. Например, в Unix в качестве разделителя каталогов используется косая черта /, а в Windows — обратная косая черта \.

# Unix (e.g. Linux, OSX, etc.)
/home/this/is/a/path/to/a/directory

# Windows
C:\home\this\is\a\path\to\a\directory

Переносимость кода — это набор принципов, которые позволяют исходному коду работать в нескольких разных средах с одинаковым поведением. Следовательно, представление пути с помощью строк не сделает это возможным, если только мы не будем обрабатывать пути по-разному в зависимости от операционной системы, в которой работает исходный код.

Но даже в этом случае мы сделали бы наш код беспорядочным и излишне сложным.

# This is a bad practice
import platform

if platform.system() == 'Windows':
  filepath = 'C:\home\this\is\a\path\to\a\directory'
else:  # e.g. 'Darwin' for OSX or 'Linux'
  filepath = '/home/this/is/a/path/to/a/directory'

Дальнейшие операции со строками, представляющими пути, также станут более сложными. Предположим, вы хотите объединить два пути — простая конкатенация строк может привести к недопустимому пути, особенно если одна или несколько строк содержат специальные символы, такие как косая черта или косая черта.

path_1 = '/this/is/a/path/'
path_2 = '/another/path'

# filepath = '/this/is/a/path//another/path'
filepath = path_1 + path_2