Сообщить об ошибке.

Различия в составлении пути к файлу в Unix и Windows

При доступе к файлу в операционной системе требуется правильно указать путь к файлу. Путь к файлу - это строка, которая представляет местоположение файла.

Предупреждение. Сразу оговоримся, чтобы не получить геморрой при составлении путей к файлам с системе Windows используйте встроенный модуль pathlib.

# Unix
/path/to/file/text.txt

# Windows
c:\path\to\file\text.txt

Он разбит на три основные части:

  1. Путь к файлу /path/to/file/: расположение директории в файловой системе, где папки разделены прямой косой чертой '/' в Unix подобных системах или обратной косой чертой '\' в Windows.
  2. Имя файла text: фактическое имя файла.
  3. Расширение .txt: используется для указания типа файла.

Для чтения или записи в файл нам необходимо его открыть, а для этого нужно передать путь к нужному файлу в качестве строки функции open(). Для Unix подобных систем это делается просто:

>>> full_path = '/path/to/file/text.txt'
>>> print(full_path)
# /path/to/file/text.txt

В системе Windows путь включает в себя обратную косую черту '\'. Этот символ в строках на Python используется для экранирования escape-последовательностей, таких как новая строка '\n'.

>>> full_path = 'c:\path\to\file\text.txt'
>>> print(full_path)
# c:\path o
#          ile    ext.txt

Что бы избежать Windows системах такого безобразия, нам нужно вручную экранировать обратную косую черту '\\' или передавать в функции open() сырую (необработанную) строку, указав перед первой кавычкой строковой литерал 'r':

# экранируем обратную косую черту
>>> full_path = 'c:\\path\\to\\file\\text.txt'
>>> print(full_path)
# c:\path\to\file\text.txt

# строковой литерал raw строки
>>> full_path = r'c:\path\to\file\text.txt'
>>> print(full_path)
# c:\path\to\file\text.txt

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

Строковое представление пути можно посмотреть функцией str() - это сам необработанный путь к файловой системе в собственном виде, например с обратным слешем в Windows, который можно передать любой функции, принимающей путь к файлу в виде строки:

>>> import pathlib

# Код запущен на Unix системах
>>> path = pathlib.Path('/foo', 'bar', 'baz')
>>> path
# PosixPath('/foo/bar/baz')
>>> str(path)
# '/foo/bar/baz'

# Код запущен на Windows системе
>>> path = pathlib.Path('c:/', 'foo', 'bar')
>>> path
# WindowsPath('c:/foo/bar')

# Строковое представление пути
# экранирование происходит автоматически
>>> str(path)
# 'c:\\foo\\bar'

Переводить путь в текстовое представление не обязательно, т.к. объект пути модуля pathlib принимают все функции.

Оператор косой черты помогает создавать дочерние пути, аналогично os.path.join():

>>> import pathlib
# Сложение путей файловой системы
>>> p = pathlib.Path('/etc')
>>> p
# PosixPath('/etc')
>>> p1 = p / 'init.d' / 'apache2'
>>> p1
# PosixPath('/etc/init.d/apache2')
>>> q = pathlib.Path('bin')
>>> q1 = '/usr' / q
>>> q1
# PosixPath('/usr/bin')

Еще примеры для OS Windows, в общем смотрите раздел "Манипуляции с путями файловой системы средствами pathlib":

# разложение пути
>>> p = pathlib.Path('c:/Program Files/PSF')
>>> p.parts
# ('c:\\', 'Program Files', 'PSF')
>>> p.is_dir()
# True

# определение диска
>>> pathlib.Path('c:/Program Files/').drive
# 'c:'
>>> pathlib.Path('/Program Files/').drive
# ''

# определение родительской директории
>>> p = pathlib.Path('c:/foo/bar/setup.py')
>>> p.is_file()
# True
>>> p.parents[0]
# WindowsPath('c:/foo/bar')
>>> p.parents[1]
# WindowsPath('c:/foo')
>>> p.parents[2]
# WindowsPath('c:/')

# Двигаемся вверх по директории
>>> for up in p.parents:
...     print(up)
... 
# c:\foo\bar
# c:\foo
# c:\