как указать путь к файлу в python windows
Как задать путь к файлу в Python?
Как задать путь к файлу в Python?
Для решения задач, связанных с редактированием или чтением файла, необходимо сообщить интерпретатору Python имя нужного нам файла, а также адрес, по которому этот файл располагается. Существуют разные способы указания пути к файлу в Python: от самого простого, до самого правильного. Давайте выясним, чем эти варианты отличаются и почему простой вариант не годится на роль лучшего!
Самый простой вариант — не самый верный!
Внимание! У этого способа обнаружен недостаток!
Самый простой вариант задания пути выглядит как последовательность директорий, в которых находится файл, с именем самого файла, разделенные знаками слеша:
Пример относительного пути:
Где вместо «Files» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.
Пример абсолютного пути:
Где вместо «C:\Python\pythonw.exe\Files\info.txt», «home/my_comp/Files/» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.
Этот вариант рабочий, однако, один существенный недостаток лишил его внимания разработчиков. Проблема заключается в том, что заданные таким способом пути адаптированы только к одному виду операционной системы: к Линукс, либо к Windows, так как в Windows используются обратные слеши «\», а в Линукс — обычные «/». Из-за этого скрипт, показывавший отличные результаты в Windows, начнет жаловаться на отсутствие файлов по прописанному пути в Linux, и наоборот. А с абсолютным путем вообще все сложно: никакого диска «C:» в Линуксе нет. Скрипт опять будет ругаться! Что же делать? Правильно указать путь к файлу!
Указываем путь к файлу правильно!
Внимание! Годный вариант!
Python — умный змей, поэтому в его арсенале, начиная с 3.4 версии появился модуль pathlib, который позволяет вытворять самые приятные вещи с путями к файлу, стоит только импортировать его класс Path:
Кстати, если у вас не установлен модуль pathlib, это легко исправить с помощью команды:
Задаем относительный путь с помощью Path!
После того, как класс импортирован, мы получаем власть над слешами! Теперь вопрос о прямых и обратных слешах в разных операционных системах ложится на плечи Path. Используя Path, вы можете корректно задать относительный путь, который будет работать в разных системах.
Например, в случае расположения файлов, как на представленном изображении, относительный путь, определяемый в скрипте «main_script.py», сформируется автоматически из перечисленных в скобках составных частей. Pathlib инициализирует новый объект класса Path, содержимым которого станет сформированный для Вашей системы относительный путь (в Windows части пути будут разделены обратными слешами, в Linux — обычными):
Задаем абсолютный путь с помощью Path
Полученную строку, содержащую путь к рабочей или домашней директории, объединим с недостающими участками пути при инициализации объекта класса Path :
Пример 1: с использованием функции cwd():
В данном случае путь к директории имеет вид: dir_path = «/home/molodec/python», а полный путь к файлу «docs.txt» будет иметь вид: «/home/molodec/python/files/info/docs.txt».
Представленный выше код можно оптимизировать и записать в одну строку:
Пример2: с использованием функции home():
В данном случае путь к директории имеет вид: dir_path = «/home/molodec», а полный путь к файлу ‘docs.txt’ будет иметь вид: «/home/molodec/files/info/docs.txt».
Сократим представленный выше код:
А почему не os.path.join?
А что же не так с заслуженным мастером по объединению путей os.path.join() и хранителем секретной информации о расположении рабочей директории os.getcwd()? Действительно, эти замечательные функции в составе модуля os довольно долго служили разработчикам Python верой и правдой. Их вполне можно использовать для определения пути к файлу. Однако, большим недостатком функции join() является невозможность принять для объединения более двух аргументов. Таким образом, чтобы присоединить к рабочей директории путь вида: ‘files/info/docs.txt’, приходится трижды обращаться к функции join(), не забывая при этом искусно жонглировать скобками. Выглядит это примерно так:
Казалось бы, ничего сложного. Однако, зачем громоздить лишние скобки, когда есть более лаконичный вариант с использованием модуля pathlib?
Подведем итог: начиная с версии Python 3.4, для задания пути к файлу рекомендуется использовать модуль pathlib с классом Path. Определить путь к рабочей директории можно с помощью функции cwd(), а путь к домашней директории подскажет функция home().
Как правильно задать путь к файлу в питоне?
т.е. нет такого файла.
Вопрос, даже два. 1. Почему нужно постоянно задавать путь к файлу, когда в любом видео-уроке или же книге оно по умолчанию открывает файл без этой ошибки? И 2 вопрос, как правильно задать путь к файлу именно в команде F = open(«») не прибегая к топорному cd?
Простой 1 комментарий
как правильно задать путь к файлу именно в команде F = open(«») не прибегая к топорному cd?
теперь
мы можем открывать/закрывать/модифицировать текстовые файлы с помощь open().
мы можем импортировать модули из других скриптов (подробнее читаем доки по импортированию)
мы используем импорт для организации более сложных программ
мы используем текстовые файлы (с любым расширением txt, json, xml, html, csv. или вообще без расширения) обычно для хранения/чтения каких-то данных
теперь внимательно:
текст с исходным текстом на питоне (модуль) является частным случаем текстового файла, поэтому в теории вы можете выполнить любые действия с ним как с обычным текстовым файлом
но обычно это имеет смысл в том случае если у вас довольно специфическая задача по кодогенерации
то есть когда вы на лету в вашем же скрипте генерируете программу ( путем написания питон инструкций), сохраняете ее и запускаете программно ( но я сомневаюсь, что это то, что вы сейчас пытаетесь сделать осознанно)
Управление путями файловой системы Python 3 с помощью модуля pathlib
Python 3 включает модуль pathlib для управления путями файловой системы независимо от операционной системы. Модуль pathlib похож на os.path, но pathlib предлагает интерфейс более высокого уровня и часто в разы удобнее, чем os.path.
Файлы на компьютере можно идентифицировать с помощью иерархических путей. Например, мы можем идентифицировать файл wave.txt на компьютере по этому пути:
Модуль pathlib будет вам полезен, если в вашей программе Python вы создаете или перемещаете файлы в файловой системе, запрашиваете списки файлов, которые соответствуют заданному расширению или шаблону, или создаете подходящие для операционной системы пути к файлам на основе коллекций необработанных строк. Для выполнения многих из этих задач вы можете использовать другие инструменты (например, модуль os.path), но модуль pathlib позволяет работать с ними в удобочитаемом формате и с минимальным объемом кода.
В этом мануале мы рассмотрим несколько способов использования модуля pathlib для представления и управления путями файловой системы.
Требования
Чтобы получить максимальную пользу от этого мануала, рекомендуем сначала изучить основы программирования на Python 3. Вы можете найти полезную информацию о Python 3 здесь.
Создание класса Path
Модуль pathlib предоставляет несколько классов, но одним из наиболее важных является класс Path. Экземпляры класса Path отображают путь к файлу или каталогу в файловой системе компьютера.
Например, следующий код создает экземпляр Path, представляющий часть пути к файлу wave.txt:
from pathlib import Path
wave = Path(«ocean», «wave.txt»)
print(wave)
Если мы запустим этот код, мы получим следующий результат:
from pathlib import Path делает класс Path доступным для программы. Затем Path (“ocean”, “wave.txt”) создает новый экземпляр Path. Вывод показывает, что Python добавил соответствующий разделитель операционной системы (/) между двумя компонентами пути, которые мы ему задали: «ocean» и «wave.txt».
Примечание: В зависимости от операционной системы ваш результат может несущественно отличаться от результатов, показанных в этом руководстве. Например, если вы работаете в Windows, в данном случае вы получите ocean\wave.txt.
В настоящее время объект Path, присвоенный переменной wave, содержит относительный путь. Другими словами, файл ocean/wave.txt может существовать в нескольких местах нашей файловой системы. Например, он может находиться в /Users/user_1/ocean/wave.txt или в /Users/user_2/research/ocean/wave.txt – мы не указали, какой именно из этих файлов мы имеем в виду. Абсолютный путь – это путь, который относится к одному расположению в файловой системе.
Вы можете использовать Path.home(), чтобы получить абсолютный путь к домашнему каталогу текущего пользователя:
home = Path.home()
wave_absolute = Path(home, «ocean», «wave.txt»)
print(home)
print(wave_absolute)
Если мы запустим этот код, мы получим примерно следующий результат:
Примечание: Как упоминалось ранее, результат будет зависеть от вашей операционной системы. Ваш домашний каталог, конечно, также будет отличаться от нашего условного /Users/planetearth.
Path.home() возвращает экземпляр Path с абсолютным путем к домашнему каталогу текущего пользователя. Затем мы передаем этот экземпляр Path и строки «ocean» и «wave.txt» в другой конструктор Path, чтобы создать абсолютный путь к файлу wave.txt. Выходные данные показывают, что первая строка – это домашний каталог, а вторая – это домашний каталог плюс ocean/wave.txt.
Этот пример также иллюстрирует важную особенность класса Path: конструктор Path принимает как строки, так и уже существующие объекты Path.
Давайте более внимательно рассмотрим поддержку строк и объектов Path в конструкторе Path:
shark = Path(Path.home(), «ocean», «animals», Path(«fish», «shark.txt»))
print(shark)
Если мы запустим этот код, мы получим такой вывод:
shark – это путь к файлу, который мы создали, используя объекты Path (Path.home() и Path(“fish”, “shark.txt”)). Конструктор Path обрабатывает оба типа объектов и аккуратно объединяет их, используя соответствующий разделитель операционной системы, в данном случае /.
Доступ к атрибутам файла
Теперь, когда вы научились создавать экземпляры Path, давайте посмотрим, как использовать эти экземпляры для доступа к информации о файле.
Мы можем использовать атрибуты name и suffix для доступа к именам и суффиксам файлов:
wave = Path(«ocean», «wave.txt»)
print(wave)
print(wave.name)
print(wave.suffix)
Запустив этот код, мы получим следующий результат:
/Users/planetearth/ocean/wave.txt
wave.txt
.txt
Экземпляры Path также предлагают функцию with_name, которая позволяет легко создавать новые объекты Path с другими именами:
wave = Path(«ocean», «wave.txt»)
tides = wave.with_name(«tides.txt»)
print(wave)
print(tides)
Если мы запустим этот код, мы получим следующий результат:
Код сначала создает экземпляр Path, который указывает на файл wave.txt. Затем мы вызываем метод with_name для wave, чтобы вернуть второй экземпляр Path, указывающий на новый файл tides.txt. Часть пути ocean/ (что указывает на каталог) остается неизменной, и в результате остается конечный путь – ocean/tides.txt.
Доступ к порождающим объектам
В некоторых ситуациях бывает необходимо получить доступ к каталогам, содержащим заданный путь. Рассмотрим такой пример:
shark = Path(«ocean», «animals», «fish», «shark.txt»)
print(shark)
print(shark.parent)
Если мы запустим этот код, мы получим вывод, который выглядит следующим образом:
Атрибут parent в экземпляре Path возвращает ближайший порождающий объект данного пути. В этом случае он возвращает каталог, содержащий файл shark.txt: ocean/animals/fish.
Мы можем получить доступ к атрибуту parent несколько раз подряд, чтобы пройти вверх по дереву порождающих объектов данного файла:
shark = Path(«ocean», «animals», «fish», «shark.txt»)
print(shark)
print(shark.parent.parent)
Запустив этот код, вы получите:
Вывод списка файлов с помощью метода glob
Также класс Path можно использовать для вывода списка файлов с помощью метода glob.
Допустим, у нас есть такая структура каталогов:
└── ocean
├── animals
│ └── fish
│ └── shark.txt
├── tides.txt
└── wave.txt
Каталог ocean содержит файлы tides.txt и wave.txt. У нас есть файл shark.txt, вложенный в каталог ocean, каталог animals и каталог fish: ocean/animals/fish.
for txt_path in Path(«ocean»).glob(«*.txt»):
print(txt_path)
Этот код даст следующий результат:
Примечание: Если вы хотите продублировать результаты, показанные в этом примере, в вашей системе, вам необходимо имитировать в ней структуру каталогов, показанную здесь.
for txt_path in Path(«ocean»).glob(«**/*.txt»):
print(txt_path)
Если мы запустим его, мы получим следующий результат:
ocean/wave.txt
ocean/tides.txt
ocean/animals/fish/shark.txt
Часть шаблона ** будет рекурсивно отвечать этому каталогу и всем его подкаталогам. Таким образом, мы получаем не только файлы wave.txt и tides.txt, а и файл shark.txt, который был вложен в ocean/animals/fish.
Вычисление относительных путей
Для вычисления путей относительно друг друга можно использовать метод Path.relative_to. Метод relative_to полезен, если, например, вы хотите получить часть длинного пути к файлу.
Давайте рассмотрим следующий код:
shark = Path(«ocean», «animals», «fish», «shark.txt»)
below_ocean = shark.relative_to(Path(«ocean»))
below_animals = shark.relative_to(Path(«ocean», «animals»))
print(shark)
print(below_ocean)
print(below_animals)
Если вы запустите его, вы получите такой вывод:
ocean/animals/fish/shark.txt
animals/fish/shark.txt
fish/shark.txt
Метод relative_to возвращает новый объект Path относительно данного аргумента. В нашем примере мы вычисляем путь к shark.txt относительно каталога ocean, а затем относительно каталогов ocean и animals.
Если relative_to не может вычислить ответ, потому что получил неправильный путь, он выдает ValueError:
shark = Path(«ocean», «animals», «fish», «shark.txt»)
shark.relative_to(Path(«unrelated», «path»))
К примеру, из нашего кода мы могли бы получить примерно такое сообщение ValueError:
Traceback (most recent call last):
File » «, line 1, in
File «/usr/local/lib/Python3.8/pathlib.py», line 899, in relative_to
raise ValueError(» does not start with »
ValueError: ‘ocean/animals/fish/shark.txt’ does not start with ‘unrelated/path’
unrelated/path не является частью ocean/animals/fish/shark.txt, поэтому Python не может вычислить относительный путь.
Заключение
Модуль pathlib – мощный компонент стандартной библиотеки Python, который позволяет нам быстро управлять путями файловой системы в любой операционной системе. В этом мануале вы научились использовать некоторые ключевые утилиты pathlib для доступа к атрибутам файлов, вывода списка файлов с помощью шаблонов glob и просмотра порождающих файлов и каталогов.
Модуль pathlib предоставляет другие классы и утилиты, которые мы не рассматривали в этом руководстве. Теперь, когда вы владеете основами, вы можете обратиться к документации модуля pathlib, чтобы узнать больше об остальных классах и утилитах pathlib.
Модуль Python OS используется для работы с операционной системой и является достаточно большим, что бы более конкретно описать его применение. С помощью его мы можем получать переменные окружения PATH, названия операционных систем, менять права на файлах и многое другое. В этой статье речь пойдет про работу с папками и путями, их создание, получение списка файлов и проверка на существование. Примеры приведены с Python 3, но и с предыдущими версиями ошибок быть не должно.
Модуль OS не нуждается в дополнительной установке, так как поставляется вместе с инсталлятором Python.
Навигация по посту
Получение директорий и списка файлов
Есть несколько способов вернуть список каталогов и файлов по указанному пути. Первый способ используя os.walk, который возвращает генератор:
Такие объекты можно итерировать для понятного отображения структуры:
Сам кортеж делится на 3 объекта: текущая директория, имя вложенных папок (если есть), список файлов. Я так же разделил их на примере ниже:
Os.walk является рекурсивным методом. Это значит, что для поиска файлов в конкретной директории вы будете итерировать и все вложенные папки. Обойти это с помощью самого метода нельзя, но вы можете использовать break так как os.walk возвращает указанную директорию первой. Можно так же использовать next():
Получение файлов через listdir
Есть еще один метод получения файлов используя listdir. Отличия от предыдущего метода в том, что у нас не будет разделения файлов и папок. Он так же не является рекурсивным:
Получение полного абсолютного пути к файлам
Для последующего чтения файла нам может понадобится абсолютный путь. Мы можем использовать обычный метод сложения строк или метод os.path.join, который сделает то же самое, но и снизит вероятность ошибки если программа работает на разных ОС:
Исключение каталогов или файлов из списка
У нас может быть список полных путей, например из списка выше, из которого мы хотим исключить папки или файлы. Для этого используется os.path.isfile:
Такой же принцип имеют следующие методы:
Получение расширения файлов
Создание и удаление директорий
Методы по изменению папок следующие:
Если попытаться создать несколько вложенных папок сразу, используя предыдущий пример, появится ошибка FileNotFoundError. Создание папок включая промежуточные выполняется с os.makedirs():
Проверка директорий и файлов на существование
Получение и изменение текущей директории
Запуская любую программу или консоль, например CMD, мы это делаем из определенной директории. С этой и соседней директорией мы можем работать без указания полного пути. Для того что бы узнать такую директорию в Python используется метод os.getcwd():
Так же как и в любых языках, в любых методах описанных выше, вы можете использовать ‘..’ для работы с директорией выше или ‘/’ для работы со внутренней:
Pathlib — манипуляция путями, создание и удаление папок и файлов
Модуль Pathlib в Python упрощает работу с файлами и папками. Он доступен в Python 3.4 и более поздних версиях. Pathlib сочетает в себе лучшее из модулей файловой системы Python — os, os.path, glob и так далее.
Содержание статьи
В Python большинство скриптов предполагает работу с файловыми системами. Следовательно, неизбежно взаимодействие с названиями файлов и путями. Именно для этого в Python есть модуль Pathlib, который содержит полезные функции для выполнения задач, связанных с файлами. Pathlib предоставляет удобный для чтения и простой способ создания путей, представляя пути файловой системы в виде надлежащих объектов. Модуль позволяет создавать код, который можно переносить между платформами.
В данной статье мы подробно изучим модуль Pathlib с помощью различных примеров.
Концепт пути и директории в Python
Перед началом подробного рассмотрения модуля Pathlib важно разобраться в разнице между главными концептами темы — путем (path) и директорией (directory).
Модуль Pathlib в Python занимается задачами, связанными с путями, такими как создание новых путей из названий файлов и других путей, проверка различных свойств путей, создание файлов и папок по определенным путям.