Python open абсолютный путь

Как прописать на Python путь к файлу в Windows, Mac и Linux

Одним из маленьких раздражителей в программировании является то, что путь к файлу в Microsoft Windows строится с использованием символа обратной косой черты между именами папок, в то время как почти все другие ОС используют прямую:

Путь к файлу в Windows: C:\some_folder\some_file.txt В большинстве других ОС: /some_folder/some_file.txt

Это случайность компьютерной истории начала 1980-х годов. В первой версии MS-DOS для указания параметров командной строки использовался символ прямой косой черты. Когда Microsoft добавила поддержку папок в MS-DOS 2.0, символ прямой косой черты был уже занят, поэтому вместо него использовалась обратная косая черта. Тридцать пять лет спустя мы по-прежнему сталкиваемся с этой несовместимостью.

Если вы хотите, чтобы ваш код на Python работал как на Windows, так и на Mac/Linux, вам придется решать подобные проблемы, связанные с конкретной платформой. К счастью, в Python 3 есть новый модуль pathlib , который делает работу с файлами практически безболезненной.

Давайте рассмотрим различные способы обработки путей к именам файлов и узнаем, как pathlib может сделать вашу жизнь лучше!

Читайте также:  Word перевод в html

Неправильное решение: построить путь к файлу вручную

Допустим, у вас есть папка, содержащая файл, который вы хотите открыть в вашей программе Python:

Путь к файлу в структуре директорий

Сделать так будет неправильно:

data_folder = "source_data/text_files/" file_to_open = data_folder + "raw_data.txt" f = open(file_to_open) print(f.read())

Обратите внимание, что я жестко закодировал путь к файлу, используя прямые слэши в стиле Unix, поскольку я работаю на Mac. Это разозлит пользователей Windows.

Технически этот код будет работать под Windows, потому что в Python есть хак, который распознает любой вид слэша, когда вы вызываете open() под Windows. Но полагаться на это не стоит. Если вы используете тип слэша, не подходящий для ОС, не все библиотеки Python будут работать, особенно если они взаимодействуют с внешними программами или библиотеками.

А поддержка Python для смешивания типов слэшей – это хак только для Windows, который не работает в обратном направлении. Использование обратных слешей в коде будет полностью провальным на Mac:

data_folder = "source_data\\text_files\\" file_to_open = data_folder + "raw_data.txt" f = open(file_to_open) print(f.read()) # На Mac этот код выбросит исключение: # FileNotFoundError: [Errno 2] No such file or directory: 'source_data\\text_files\\raw_data.txt'

По этим и другим причинам написание кода с жестко закодированными строками путей – это то, что заставит других программистов смотреть на вас с большим подозрением. В общем, нужно стараться избегать этого.

Старое решение: построить путь к файлу при помощи модуля os.path

Модуль os.path в Python имеет множество инструментов для решения ОС-специфичных проблем с файловой системой.

Вы можете использовать os.path.join() для построения строки пути, используя нужный вид слэша для текущей операционной системы:

import os.path data_folder = os.path.join("source_data", "text_files") file_to_open = os.path.join(data_folder, "raw_data.txt") f = open(file_to_open) print(f.read())

Этот код будет отлично работать как на Windows, так и на Mac. Проблема в том, что его сложно использовать. Выписывать os.path.join() и передавать каждую часть пути в виде отдельной строки – многословно и неинтуитивно.

Поскольку большинство функций в модуле os.path так же неудобны в использовании, разработчики часто “забывают” их использовать. Это приводит к множеству кроссплатформенных ошибок и недовольству пользователей.

Лучшее решение: использовать pathlib в Python 3

В Python 3.4 появилась новая стандартная библиотека с модулем pathlib для работы с файлами и путями – и это замечательно!

Теперь вам достаточно передать путь к файлу или его имя в новый объект Path() , используя прямые косые черты, а все остальное pathlib сделает сам:

from pathlib import Path data_folder = Path("source_data/text_files/") file_to_open = data_folder / "raw_data.txt" f = open(file_to_open) print(f.read())

Обратите внимание на два момента:

  • С функциями pathlib нужно использовать прямые слэши. Объект Path() преобразует их в правильный вид слэша для текущей операционной системы. Отлично!
  • Если вы хотите дополнить путь к файлу, можно использовать оператор / непосредственно в коде. Попрощайтесь с беспрестанным набором os.path.join(a, b) .

И даже если бы это было всё, на что способен pathlib , это уже было бы отличным дополнением к Python. Но этот модуль способен на большее!

Например, мы можем прочитать содержимое текстового файла, не возясь с его открытием и закрытием:

from pathlib import Path data_folder = Path("source_data/text_files/") file_to_open = data_folder / "raw_data.txt" print(file_to_open.read_text())

Фактически, pathlib делает большинство стандартных операций с файлами быстрыми и простыми:

from pathlib import Path filename = Path("source_data/text_files/raw_data.txt") print(filename.name) # Выводит "raw_data.txt" print(filename.suffix) # Выводит "txt" print(filename.stem) # Выводит "raw_data" if not filename.exists(): print("Oops, file doesn't exist!") else: print("Yay, the file exists!")

Вы даже можете использовать pathlib для явного преобразования пути Unix в путь в формате Windows:

from pathlib import Path, PureWindowsPath filename = Path("source_data/text_files/raw_data.txt") # Конвертировать путь в формат Windows path_on_windows = PureWindowsPath(filename) print(path_on_windows) # Вывод: # source_data\text_files\raw_data.txt

И если вы хотите действительно безопасно использовать обратные слеши в своем коде, вы можете объявить свой путь к файлу в формате Windows, и pathlib преобразует его для работы в текущей операционной системе:

from pathlib import Path, PureWindowsPath # Я явно объявил мой путь в формате Windows, чтобы использовать в нем прямые слэши. filename = PureWindowsPath("source_data\\text_files\\raw_data.txt") # Конвертировать путь в подходящий для текущей ОС формат correct_path = Path(filename) print(correct_path) # Выводит "source_data/text_files/raw_data.txt" на Mac и Linux # Выводит "source_data\text_files\raw_data.txt" на Windows

Проявив смекалку, можно использовать pathlib даже для разрешения относительных путей к файлам, разбора путей к сетевым ресурсам и генерации URL file://. Вот пример из всего пары строк кода, которые откроют локальный файл в вашем браузере:

from pathlib import Path import webbrowser filename = Path("source_data/text_files/raw_data.txt") webbrowser.open(filename.absolute().as_uri())

Это был лишь небольшой обзор pathlib . Этот модуль – отличная замена для множества различных функций, связанных с файлами, которые раньше были разбросаны по разным модулям Python. Проверьте!

1 комментарий к “Как прописать на Python путь к файлу в Windows, Mac и Linux”

Источник

Как задать путь к файлу в Python?

Для решения задач, связанных с редактированием или чтением файла, необходимо сообщить интерпретатору Python имя нужного нам файла, а также адрес, по которому этот файл располагается. Существуют разные способы указания пути к файлу в Python: от самого простого, до самого правильного. Давайте выясним, чем эти варианты отличаются и почему простой вариант не годится на роль лучшего!

Самый простой вариант — не самый верный!

Внимание! У этого способа обнаружен недостаток!

Самый простой вариант задания пути выглядит как последовательность директорий, в которых находится файл, с именем самого файла, разделенные знаками слеша:

Пример относительного пути:
path = "Files/info.txt" # в Линуксе, или: path = "Files\info.txt" # в Windows

Где вместо «Files» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.

Пример абсолютного пути:
path = "/home/my_comp/Files/info.txt" # для Линукс, или: path = "C:\Python\pythonw.exe\Files\info.txt" # для Windows

Где вместо «C:\Python\pythonw.exe\Files\info.txt», «home/my_comp/Files/» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.

Этот вариант рабочий, однако, один существенный недостаток лишил его внимания разработчиков. Проблема заключается в том, что заданные таким способом пути адаптированы только к одному виду операционной системы: к Линукс, либо к Windows, так как в Windows используются обратные слеши «\», а в Линукс — обычные «/». Из-за этого скрипт, показывавший отличные результаты в Windows, начнет жаловаться на отсутствие файлов по прописанному пути в Linux, и наоборот. А с абсолютным путем вообще все сложно: никакого диска «C:» в Линуксе нет. Скрипт опять будет ругаться! Что же делать? Правильно указать путь к файлу!

Указываем путь к файлу правильно!

Внимание! Годный вариант!

Python — умный змей, поэтому в его арсенале, начиная с 3.4 версии появился модуль pathlib, который позволяет вытворять самые приятные вещи с путями к файлу, стоит только импортировать его класс Path:

import pathlib from pathlib import Path

Кстати, если у вас не установлен модуль pathlib, это легко исправить с помощью команды:

Задаем относительный путь с помощью Path!

После того, как класс импортирован, мы получаем власть над слешами! Теперь вопрос о прямых и обратных слешах в разных операционных системах ложится на плечи Path. Используя Path, вы можете корректно задать относительный путь, который будет работать в разных системах.

Например, в случае расположения файлов, как на представленном изображении, относительный путь, определяемый в скрипте «main_script.py», сформируется автоматически из перечисленных в скобках составных частей. Pathlib инициализирует новый объект класса Path, содержимым которого станет сформированный для Вашей системы относительный путь (в Windows части пути будут разделены обратными слешами, в Linux — обычными):

import pathlib from pathlib import Path path = Path("files", "info", "docs.txt") ## выведем значение переменной path: print(str(path))
## выведем значение переменной path: files/info/docs.txt

У нас появился Telegram-канал для изучающих Python! Канал совсем свежий, подпишись одним из первых, ведь вместе «питонить» веселее! 😉 Ссылка на канал: «Кодим на Python!»

Задаем абсолютный путь с помощью Path

  • cwd() — возвращает путь к рабочей директории
  • home() — возвращает путь к домашней директории

Полученную строку, содержащую путь к рабочей или домашней директории, объединим с недостающими участками пути при инициализации объекта класса Path :

Пример 1: с использованием функции cwd():
import pathlib from pathlib import Path #Получаем строку, содержащую путь к рабочей директории: dir_path = pathlib.Path.cwd() # Объединяем полученную строку с недостающими частями пути path = Path(dir_path, 'files','info', 'docs.txt') # выведем значение переменной path: print(str(path))
# выведем значение переменной path: "/home/my_comp/python/files/info/docs.txt"

В данном случае путь к директории имеет вид: dir_path = «/home/my_comp/python», а полный путь к файлу «docs.txt» будет иметь вид: «/home/my_comp/python/files/info/docs.txt».

Представленный выше код можно оптимизировать и записать в одну строку:

import pathlib from pathlib import Path path = Path(pathlib.Path.cwd(), 'files', 'info', 'docs.txt') # значение переменной path: print(str(path))
# значение переменной path: "/home/my_comp/python/files/info/docs.txt"
Пример2: с использованием функции home():
import pathlib from pathlib import Path #Получаем строку, содержащую путь к домашней директории: dir_path = pathlib.Path.home() # Объединяем полученную строку с недостающими частями пути path = Path(dir_path, 'files','info', 'docs.txt') # Выведем значение переменной path: print(str(path))
# Выведем значение переменной path: "/home/my_comp/files/info/docs.txt"

В данном случае путь к директории имеет вид: dir_path = «/home/my_comp», а полный путь к файлу ‘docs.txt’ будет иметь вид: «/home/my_comp/files/info/docs.txt».

Сократим представленный выше код:

import pathlib from pathlib import Path path = Path(pathlib.Path.home(), 'files', 'info', 'docs.txt') # Значение переменной path: print(str(path))
# Значение переменной path: "/home/my_comp/files/info/docs.txt"

Подведем итог: начиная с версии Python 3.4, для задания пути к файлу рекомендуется использовать модуль pathlib с классом Path. Определить путь к рабочей директории можно с помощью функции cwd(), а путь к домашней директории подскажет функция home().

Источник

Оцените статью