Как указать путь к файлу в python

Обновлено: 07.07.2024

Достаточно часто возникают ситуации, когда у нас есть полное имя файла, а требуется узнать его расширение. Или добавить нужное расширение, когда не известно, ввел его пользователь или нет. Иногда у нас есть относительный путь до файла, а требуется узнать абсолютный. Про основные методы работы с именем файла и будет эта статья.

Абсолютный путь к файлу

Для того чтобы узнать в Python абсолютный путь к файлу, потребуется воспользоваться библиотекой os. Её подключаем с помощью команды import os. В классе path есть метод abspath. Вот пример использования.

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

Имя файла

Чтобы узнать имя файла из полной строки с путем, воспользуемся методом basename модуля os.

Здесь перед строкой вставил r, чтобы подавить возможное возникновение служебных символов. Например, в данном случае если не указать r, то \f считалось бы символом перевода страницы.

Без расширения

Теперь разберемся, как в Python узнать имя файла без расширения. Воспользуемся методом splittext. В этот раз для примера возьмем файл с двойным расширением, чтобы проверить, как будут в этой ситуации работать стандартны функции.

Видно, что последнее расширение архиватора gz было отброшено, в то время как расширение несжатого архива tar осталось в имени.

Если же нам нужно только имя, то можно отбросить все символы полученной строки, которые идут после первой точки. Символ точки тоже отбросим.

Дополним предыдущий пример следующим кодом:

Расширение файла

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

Аналогично можно воспользоваться библиотекой pathlib. Воспользуемся методом suffix.

Но в нашем случае два расширения. Их можно узнать с помощью функции suffixes. Она возвращает список, элементами которого и будут расширения. Ниже приведен пример получения списка расширений.

Знаю, что вопрос глупый, но всегда, открывай файл так: cd Desktop и следующей командой шло python3 (имя файла с расширением .py)
начал проходить тему файлов, где можно открывать, как
F = open('имя файла с расширением'), на что он мне выдает

т.е. нет такого файла.
Вопрос, даже два. 1. Почему нужно постоянно задавать путь к файлу, когда в любом видео-уроке или же книге оно по умолчанию открывает файл без этой ошибки? И 2 вопрос, как правильно задать путь к файлу именно в команде F = open("") не прибегая к топорному cd?

Простой 1 комментарий

sim3x

как правильно задать путь к файлу именно в команде F = open("") не прибегая к топорному cd?
А почему он требует указать путь каждый раз при новой команде? Когда скажем в тех же уроках на ютюбе им это делать не приходиться. Им достаточно написать f = open с именем и расширением и не возникает ошибки. ну учитывая что мне уроки отсюда не видать
ответить на этот вопрос очень сложно
но я предположу что файловая структура у вас немного отличается от того что есть в уроках
магии то там нет, питон одинаково работает но я уже понял по-моему в чем состоит ваша проблема
вы путаете работу с текстовыми файлами
и работу с другими исходниками на питоне
исходники мы импортируем
другие файлы мы открываем
по-этому народ и недоумевал зачем вы хотите открыть .py файл, потому что это подразумевает что мы будем оттуда что-то читать или писать.
читают и пишут исходники обычно в редакторах
а в файлы читают и пишут обычно данные, конфиги и все остальное Stanislav Pugachev, но опять же я открыл текстовый файл и дал ему расширение .py я почему-то воспринимаю его как текстовый файл, который грубо говоря работает с командами питона и скажем print будет не просто словом в тексте, а командой так ведь? разница ведь только в этом? т.е. файл просто набор текста, а файл с расширением .py модуль который работает с командами питона правильно? Евгений Колесов,
нене, print будет просто словом в тексте, потому что командой он становится только после интерпретации
а до этого обычный текстовый файл и расширение у него может быть какое угодно
расширение файла например вообще опционально и существует как вспомогательная штука, а не как несущая какой-то технический смысл Stanislav Pugachev, ну получается файлы с расширением txt мы открываем через file open, а с расширением .py мы импортируем, как import file(кстати пока не понимаю почему открывая терминал эта команда работает, а если в терминале вызвать питон и вписать это же, то он выдает синтаксическую ошибку(если написать import file(имя файла), а если просто указать import file, то он пишет нет имени файл(что в принципе логично), так и должно быть, что он работает в терменале до запуска питона? или тут я тоже допускаю ошибку?)
P.s. лимит комментариев кончился
P.s.s лимит на комменты пошел, а ответ на свой вопрос можно один раз добавлять, так что пишу здесь. Ваши (Stanislav Pugachev Stanislav Pugachev ) решения мне помогли, спасибо большое за терпение и советы!

теперь
мы можем открывать/закрывать/модифицировать текстовые файлы с помощь open().
мы можем импортировать модули из других скриптов (подробнее читаем доки по импортированию)

мы используем импорт для организации более сложных программ
мы используем текстовые файлы (с любым расширением txt, json, xml, html, csv. или вообще без расширения) обычно для хранения/чтения каких-то данных

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

Работа с папками и создание путей с модулем OS в Python

Модуль Python OS используется для работы с операционной системой и является достаточно большим, что бы более конкретно описать его применение. С помощью его мы можем получать переменные окружения PATH, названия операционных систем, менять права на файлах и многое другое. В этой статье речь пойдет про работу с папками и путями, их создание, получение списка файлов и проверка на существование. Примеры приведены с Python 3, но и с предыдущими версиями ошибок быть не должно.

Модуль OS не нуждается в дополнительной установке, так как поставляется вместе с инсталлятором Python.

Навигация по посту

Получение директорий и списка файлов

Есть несколько способов вернуть список каталогов и файлов по указанному пути. Первый способ используя os.walk, который возвращает генератор:

Получение списка папок и файлов с библиотекой os в Python

Такие объекты можно итерировать для понятного отображения структуры:

Обработка списка директорий и файлов с библиотекой os в Python

Сам кортеж делится на 3 объекта: текущая директория, имя вложенных папок (если есть), список файлов. Я так же разделил их на примере ниже:

Разделение директорий и папок с библиотекой os в Python

Os.walk является рекурсивным методом. Это значит, что для поиска файлов в конкретной директории вы будете итерировать и все вложенные папки. Обойти это с помощью самого метода нельзя, но вы можете использовать break так как os.walk возвращает указанную директорию первой. Можно так же использовать next():

Вывод первой директории с OS walk в Python

Получение файлов через listdir

Есть еще один метод получения файлов используя listdir. Отличия от предыдущего метода в том, что у нас не будет разделения файлов и папок. Он так же не является рекурсивным:

Вывод списка файлов и папок с библиотекой os.listdir в Python

Получение полного абсолютного пути к файлам

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

Получение абсолютного пути с os.path.join в Python

Исключение каталогов или файлов из списка

У нас может быть список полных путей, например из списка выше, из которого мы хотим исключить папки или файлы. Для этого используется os.path.isfile:

Проверка папок и файлов с os.path.os.isfile()

Такой же принцип имеют следующие методы:

  • os.path.isdir() - относится ли путь к папке;
  • os.path.islink() - относится ли путь к ссылке;

Получение расширения файлов

Расширение файла можно получить с помощью os.path.splittext(). Этот метод вернет путь до расширения и само расширение. Этот метод исключает ситуацию, когда точка может стоять в самом пути. Если в качестве пути мы выберем каталог (который не имеет расширения) , результатом будет пустая строка:

Получение расширений файлов с os.path.splittext в Python

os.path.basename(path) - вернет имя файла и расширение.

Создание и удаление директорий

Методы по изменению папок следующие:

  • os.mkdir() - создаст папку;
  • os.rename() - переименует;
  • os.rmdir() - удалит.

Создание и удаление директорий в Python с os.mkdir и os.rmdir

Если попытаться создать несколько вложенных папок сразу, используя предыдущий пример, появится ошибка FileNotFoundError. Создание папок включая промежуточные выполняется с os.makedirs():

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

Если мы пытаемся создать папку с существующим именем, то получим ошибку FileExistsError. Один из способов этого избежать - использование os.path.exists(), который вернет True в случае существования файла или папки:

Проверка существование пути с os.path.exists в Python

Получение и изменение текущей директории

Запуская любую программу или консоль, например CMD, мы это делаем из определенной директории. С этой и соседней директорией мы можем работать без указания полного пути. Для того что бы узнать такую директорию в Python используется метод os.getcwd():

Получение текущей директории с os.getcwd в Python

Изменение директории с Python os.chdir


Содержание статьи

В Python большинство скриптов предполагает работу с файловыми системами. Следовательно, неизбежно взаимодействие с названиями файлов и путями. Именно для этого в Python есть модуль Pathlib, который содержит полезные функции для выполнения задач, связанных с файлами. Pathlib предоставляет удобный для чтения и простой способ создания путей, представляя пути файловой системы в виде надлежащих объектов. Модуль позволяет создавать код, который можно переносить между платформами.

В данной статье мы подробно изучим модуль Pathlib с помощью различных примеров.

Концепт пути и директории в Python

  • Путь используется для идентификации файла. Путь предоставляет необязательную последовательность названий директорий, в конце которой значится конечное имя файла, а также его расширение;
  • Расширение названия файла предоставляет некоторую информацию о формате/содержимом файла. Модуль Pathlib может работать как с абсолютными, так и с относительными путями;
  • Абсолютный путь начинается с корневой директории и определяет полное дерево каталогов;
  • Относительный путь, как следует из названия, является путем к файлу относительно другого файла или директории, обычно текущей;
  • Директория представляет собой запись пути в файловой системе и включает название файла, время создания, размер, владельца и так далее.

Модуль Pathlib в Python занимается задачами, связанными с путями, такими как создание новых путей из названий файлов и других путей, проверка различных свойств путей, создание файлов и папок по определенным путям.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Как использовать модуль Pathlib?

Для работы с Pathlib в Python требуется импортировать все классы данного модуля, используя следующую команду:

В качестве первого задания давайте извлечем текущую рабочую директорию и домашнюю директорию объектов, используя следующий код:

Вместо импорта всех классов можно использовать import pathlib . В таком случае, задействуя классы внутри модуля, требуется добавлять через pathlib .

Зачем использовать модуль Pathlib?

Если вы некоторое время работали с языком Python, у вас может возникнуть вопрос. Зачем нужен модуль Pathlib, когда уже есть модули os , os.path , glob и прочие? Это хороший вопрос. Давайте попробуем ответить на него, разобрав следующий пример.

Допустим, мы хотим создать файл под названием "output/output.xlsx" в текущем рабочем каталоге. Следующий код пытается сделать это с помощью модуля os.path . Также используются функции os.getcwd и os.path.join .

outpath_file = os . pathjoin ( os.path . join ( os . getcwd ( ) , 'output' ) , "out.xlsx" )

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

Данный код можно переписать, используя модуль Pathlib:

Такой формат проще укладывается в голове. В Pathlib функция Path.cwd() используется для получения текущего рабочего каталога, а оператор / используется вместо os.path.join для объединения частей пути в составной объект пути.

Шаблон вложенности функций в модуле os.path заменяется классом Path модуля Pathlib, что представляет путь через объединение методов и атрибутов. Умная перегрузка оператора / делает код читабельным и простым в обращении.

Другое преимущество метода, предоставляемого модулем Pathlib, заключается в том, что объект Path создается вместо строкового представления пути. У этого объекта есть несколько удобных методов, что имеют значительное преимущество перед работой с необработанными строками, которые представляют пути.

Создание и удаление папок через Pathlib

Классический модуль os.path используется только для манипуляции строками пути. Чтобы что-то сделать с путем, например, создать директорию, нам нужен модуль os . Модуль os предоставляет набор функций для работы с файлами и каталогами, например: mkdir для создания директории, rename для переименования, а getsize для получения ее размера.

Давайте напишем некоторые из этих операций с помощью модуля os , а затем перепишем тот же код с помощью модуля Pathlib.

Пример кода, написанный с использованием модуля os :

Если мы используем объекты path модуля Pathlib для достижения той же функциональности, конечный код будет читабельнее и легче для понимания:

В модуле os сложновато найти утилиты, связанные с путем. Модуль Pathlib решает эту проблему, заменяя утилиты модуля os методами объектов путя. Давайте попробуем разобраться в этом на примере следующего кода:

outpath_tmp = os.path . join ( os . getcwd ( ) , 'output.tmp' )

Здесь функция generate_data() принимает путь к файлу в качестве параметра и записывает данные в другой путь. Однако, если файл, который передается в качестве параметра, не изменяется, так как в последний раз была выполнена функция generate_data() , генерируется пустой файл. В этом случае пустой файл заменяется предыдущей версией файла.

Читайте также: