Python путь к файлу и расширение — Получение имени из полного пути
Достаточно часто возникают ситуации, когда у нас есть полное имя файла, а требуется узнать его расширение. Или добавить нужное расширение, когда не известно, ввел его пользователь или нет. Иногда у нас есть относительный путь до файла, а требуется узнать абсолютный. Про основные методы работы с именем файла и будет эта статья.
Абсолютный путь к файлу
Для того чтобы узнать в Python абсолютный путь к файлу, потребуется воспользоваться библиотекой os. Её подключаем с помощью команды import os. В классе path есть метод abspath. Вот пример использования.
import os p = os.path.abspath('file.txt ') print(p) C:\python3\file.txt
Так же можно воспользоваться и стандартной библиотекой pathlib. Она вошла в состав основных библиотек, начиная с версии Python 3.4. До этого надо было ее инсталлировать с помощью команды pip install pathlib. Она предназначена для работы с путями файловой системы в разных ОС и отлично подойдет для решения данной задачи.
import pathlib p = pathlib.Path('file.txt ') print(p) C:\python3\file.txt
Имя файла
Чтобы узнать имя файла из полной строки с путем, воспользуемся методом basename модуля os.
import os name = os.path.basename(r'C:\python3\file.txt ') print(name) file.txt
Здесь перед строкой вставил r, чтобы подавить возможное возникновение служебных символов. Например, в данном случае если не указать r, то \f считалось бы символом перевода страницы.
Без расширения
Теперь разберемся, как в Python узнать имя файла без расширения. Воспользуемся методом splittext. В этот раз для примера возьмем файл с двойным расширением, чтобы проверить, как будут в этой ситуации работать стандартны функции.
from os import path full_name = path.basename(r'C:\python3\file.tar.gz ') name = path.splitext(full_name)[0] print(name) file.tar
Видно, что последнее расширение архиватора gz было отброшено, в то время как расширение несжатого архива tar осталось в имени.
Если же нам нужно только имя, то можно отбросить все символы полученной строки, которые идут после первой точки. Символ точки тоже отбросим.
Дополним предыдущий пример следующим кодом:
index = name.index('.') print(name[:index]) file
Расширение файла
В Python получить расширение файла можно аналогичным образом с помощью той же функции splitext. Она возвращает кортеж. Первый элемент кортежа имя, а второй – расширение. В данном случае нам нужен второй элемент. Индекс второго элемента равен единице, так как отсчет их идет от нуля.
from os import path full_name = path.basename(r'C:\python3\file.tar.gz ') name = path.splitext(full_name)[1] print(name) .gz
Аналогично можно воспользоваться библиотекой pathlib. Воспользуемся методом suffix.
from pathlib import Path print(Path(r'C:\python3\file.tar.gz ').suffix) .gz
Но в нашем случае два расширения. Их можно узнать с помощью функции suffixes
from pathlib import Path print(Path(r'C:\python3\file.tar.gz ').suffixes) ['.tar', '.gz ']
Для того, чтобы получить имя файла или расширение из полного пути или для получения абсолютного пути к файлу используйте библиотеки os и pathlib. Лучше воспользоваться готовым решением из стандартой библиотеками, чем писать свое решение.
Получение списка файлов в директории на Python
| Python
Всё чаще современные программисты предпочитают работать с языком программирования Python, потому что он очень гибкий, позволяющий легко взаимодействовать с операционной системой. Он также поставляется с функциями по работе с файловой системой. Решение задачи распечатки списка файлов в директории можно решить используя разные модули: os, subprocess, fnmatch и pathlib.
Следующие решения демонстрируют, как успешно воспользоваться этими модулями.Применение os.walk()
Модуль os содержит длинный список методов, которые касаются работы с файловой системой и операционной системой. Один из них walk(), возвращающий имена файлов в дереве каталогов, двигаясь по дереву сверху вниз или снизу вверх (сверху вниз по умолчанию).
os.walk() возвращает список из трех элементов: имя корневого каталога, список имен вложенных папок и список файлов в текущем каталоге. Он одинаково хорошо работает с интерпретаторами Python 2 и 3.
import os for root, dirs, files in os.walk("."): for filename in files: print(filename)
Использование командной строки, через subprocess
Модуль subprocess позволяет выполнить системную команду и собрать её результат. В нашем случае вызываемая системная команда выглядит следующим образом:
$ ls -p . | grep -v /$
Инструкция ls -p . распечатывает список файлов текущего каталога, добавляя разделитель / в конце имени каждого подкаталога, которые нам понадобится на следующем шаге.
Модуль subprocess позволяет строить настоящие конвейеры, а также соединять входные и выходные потоки, как это делается в командной строке. Вызов метода subprocess.Popen() открывает соответствующий процесс и определяет два параметра stdin и stdout.
Первая переменная ls определяет процесс выполнения ls –p для захвата stdout в конвейере. Поэтому поток stdout определяется как subprocess.PIPE. Вторая переменная grep также определяется как процесс, но вместо этого выполняет инструкцию grep –v /$.
Чтобы прочитать вывод команды ls из конвейера, поток stdin grep присваиваивается в ls.stdout. В заключение, переменная endOfPipe считывает вывод команды grep из grep. stdout, затем распечатывается в stdout циклом for.
import subprocess # определение команды ls ls = subprocess.Popen(["ls", "-p", "."], stdout=subprocess.PIPE, ) # определение команды grep grep = subprocess.Popen(["grep", "-v", "/$"], stdin=ls.stdout, stdout=subprocess.PIPE, ) # чтение из данных из потока stdout endOfPipe = grep.stdout # распечатка файлов в строку for line in endOfPipe: print(line)
Запуск файла
$ python find-files3.py find-files2.py find-files3.py find-files4.py ...
Данное решение работает достаточно хорошо с Python 2 и 3, но его можно улучшить. Рассмотрим другие варианты.
Комбинация os и fnmatch
Решение, использующее подпроцессы, элегантно, но требует большого количества кода. Вместо этого, давайте объединим методы из двух модулей os и fnmatch. Этот вариант также работает с Python 2 и 3.
В качестве первого шага, импортируем модули os и fnmatch. Далее определим каталог, в котором нужно перечислить файлы, используя os.listdir(), а также шаблон для фильтрации файлов. В цикле for выполняется итерация списка записей, хранящихся в переменной listOfFiles.
В завершение, с помощью fnmatch отфильтровываются искомые записи и распечатываются соответствующие записи в stdout.
import os, fnmatch listOfFiles = os.listdir('.') pattern = "*.py" for entry in listOfFiles: if fnmatch.fnmatch(entry, pattern): print(entry)
Результат выполнения
$ python find-files.py find-files.py find-files2.py find-files3.py ...
Использование os.listdir() и генераторов
Следующий вариант объединяет метод os.listdir() с функцией генератором. Код работает как с версиями 2, так и с 3 Python.
Как уже было сказано ранее, listdir() возвращает список записей для данного каталога. Метод os.path.isfile() возвращает True, если данная запись является файлом. Оператор yield завершает работу функции, но сохраняя текущее состояние и возвращает только имя записи являющейся файлом.
import os def files(path): for file in os.listdir(path): if os.path.isfile(os.path.join(path, file)): yield file for file in files("."): print(file)
Использование pathlib
В следующем листинге определяется текущий каталог точкой («.»). Затем метод iterdir() возвращает итератор, который возвращает имена всех файлов. Далее циклом for распечатываются имена файлов друг за другом.
import pathlib # определение пути currentDirectory = pathlib.Path('.') for currentFile in currentDirectory.iterdir(): print(currentFile)
В качестве альтернативы, можно отфильтровать файлы по именам с помощью метода glob. Таким образом, получаем требуемые файлы. Например, в приведенном ниже коде перечисляются Python файлы в выбранном каталоге, указав шаблон «*.py» в glob.
import pathlib # определение пути currentDirectory = pathlib.Path('.') # определение шаблона currentPattern = "*.py" for currentFile in currentDirectory.glob(currentPattern): print(currentFile)
Использование os.scandir()
В Python 3.6 добавлен новый метод scandir(), доступный из модуля os. Как понятно из названия он значительно упрощает получение списка файлов в каталоге.
Чтобы определить текущий рабочий каталог и сохранить его, инициализируем значение переменной path, для этого импортируем модуль os и вызовем функцию getcwd(). Далее, scandir() возвращает список записей для выбранного пути, которые проверяются на принадлежность файлу, используя метод is_file().
import os # определение текущей рабочей директории path = os.getcwd() # чтение записей with os.scandir(path) as listOfEntries: for entry in listOfEntries: # печать всех записей, являющихся файлами if entry.is_file(): print(entry.name)
Вывод
Ведутся споры, какой вариант является лучшим, какой наиболее элегантным и какой является наиболее «питоничным». Мне нравится простота метода os.walk(), а также модули fnmatch и pathlib.
Две версии с процессами/конвейером и итератором требуют более глубокого понимания процессов UNIX и знаний Python, поэтому они не могут быть предпочтительными для всех программистов из-за их дополнительной (и избыточной) сложности.
Чтобы найти ответ на этот вопрос, выберем самой быстрой из них, воспользовавшись удобным модулем timeit. Данный модуль подсчитывает время, прошедшее между двумя событиями.
Для сравнения всех решений без их изменений, воспользуемся функциональностью Python: вызовем интерпретатор с модулем timeit и соответствующим Python скриптом. Для автоматизации процесса напишем shell скрипт
#! /bin/bash for filename in *.py; do echo "$filename:" cat $filename | python3 -m timeit echo " " done
Тесты проводились с использованием Python 3. 6. Среди всех тестов os.walk() показала себя наилучшим образом. Выполнение тестов с помощью Python 2 возвращает разные значения, но os.walk() по-прежнему находится на вершине списка.
03 Методы получения имени файла из пути в Python (с кодом)
Во многих случаях во время кодирования вам придется иметь дело с файлами. Во многих сценариях конкурентного кодирования вы также столкнетесь с входными файлами, которые будут предоставлены вам для тестирования. Работа с файлами на любом языке программирования — важный навык, который должен освоить каждый программист.
Первым шагом в работе с файлами является возможность проанализировать имя файла от пользователя. Когда файл должен быть прочитан в программе, как мы можем получить к нему доступ? Итак, мы узнаем здесь Как мне получить имя файла из пути в Python? Мы перечислили оба способа с расширением и без него.
Что такое имя файла и путь?Имя файла и путь — это две терминологии, связанные с обработкой файлов. Как следует из названия, имя файла относится к имени фактического файла, тогда как путь относится к точному местоположению файла .
Доступ к содержимому файла возможен только по его имени. Но ОС или используемое нами операционное программное обеспечение не хранят имя файла как единое целое.
Например, если мы хотим пойти в наш университет, то наш университет — это имя файла, а набор направлений, необходимых для его достижения, — это путь. Давайте возьмем тот же пример, который мы привели выше, чтобы понять эту концепцию:
C:\Users\User1\Documents\file1.txt
Как вы думаете, какое имя файла? Имя файла в этом примере — file1.txt. Простой способ узнать имя файла — найти его часть с расширением. Расширение — это не что иное, как комбинация нескольких букв после имени файла.
В этом примере file1.txt — это имя файла, так как он имеет расширение .txt. Различные файлы имеют разные расширения в зависимости от типа файлов, которыми они являются. Текстовый файл будет иметь формат .txt, презентация PowerPoint — .ppt, текстовый документ — .docx и т. д.
Таким образом, найдя расширение, мы можем найти имя файла. Но как быть с оставшейся частью? Оставшаяся часть после того, как мы удалим путь к файлу, дает расположение файла в системе пользователя.
В этом примере это говорит нам о том, что файл file1.txt хранится в папке «Документы», которая хранится в папке «Пользователь1», которая сама хранится в папке «Пользователи», которая, наконец, хранится на диске C компьютера. Полное имя, оставшаяся часть и имя файла вместе называются путем.
Но как мне прочитать имя файла из пути в Python?
03 Методы получения имени файла из пути в PythonЕсть три метода, которые мы можем использовать для получения имени файла из заданного пути в Python. Некоторые из этих методов используют встроенные функции, другие используют модуль. Модуль — это набор предопределенных функций, которые мы можем напрямую включить в наш код.
01) Функция разделения в pythonЛюбой путь, который передается интерпретатору, будет строковым значением. Строковое значение в Python — это не что иное, как комбинация символов. Когда путь передается как вход, он будет выглядеть как C:\Users\User1\Documents\file1.txt
Теперь мы можем использовать встроенную функцию разделения в python для разделения имени пути. Мы разделим имя пути на каждый \. Как только мы это сделаем, у нас будет кортеж, содержащий все слова между косыми чертами. Затем мы печатаем последний элемент кортежа и получаем имя файла с расширением.
Мы можем дополнительно разделить последний элемент по точке (.), чтобы получить только имя файла, а не расширение. Реализация кода для этого метода для извлечения имени файла из пути показана ниже:
file_path = "C:/Пользователи/Пользователь1/Документы/файл1.txt" имя_файла = путь_к_файлу.split("/")[-1] print(file_name)
Вывод:
file1. txt
02) Модуль ОС в Python
Как следует из названия, модуль ОС в Python предоставляет специальные функции и методы для работы операционной системы, такие как извлечение имени файла. Мы можем использовать функцию os.path.basename, чтобы получить имя файла из пути, указанного пользователем.
Кроме того, мы можем использовать функцию os.path.splitext для получения имени файла без расширения. Реализация кода с использованием модуля os приведена ниже:
import os file_path = "C:/Пользователи/Пользователь1/Документы/файл1.txt" полное_имя = os.path.basename(file_path) имя_файла = os.path.splitext(полное_имя) печать (полное_имя) print(file_name[0])
Вывод:
file1.txt файл1
03) Использование модуля Pathlib в Python
Помимо библиотеки ОС, Python также предоставляет библиотеку, предназначенную для обработки различных типов путей, предоставляемых различными операционными системами. Внутри библиотеки pathlib мы можем использовать функцию Path, чтобы получить имя файла по заданному пути.
Функция Path имеет два атрибута: основу и имя. Атрибут основы дает имя файла без расширения, а атрибут имени дает полное имя файла вместе с расширением. Реализация кода с использованием функции пути показана ниже:
из пути импорта pathlib file_path = "C:/Пользователи/Пользователь1/Документы/файл1.txt" полное_имя = Путь(путь_к_файлу).имя имя_файла = Путь(путь_к_файлу).основа печать (полное_имя) печать (имя_файла)
Вывод:
файл1.txt файл1
Теперь вы можете узнать, как перезаписать файл в Python, здесь.
ВыводыИмя файла и путь важны для чтения и анализа входных данных из файла. Без имени файла невозможно прочитать содержимое или выполнить операции с файлом. Мы изучили 03 метода получения имени файла из пути в python. Мы также предоставили исходный код, чтобы сделать это самостоятельно. Попробуй это сейчас!
Программа Python для получения имени файла из пути к файлу
В этой статье мы рассмотрим программу для получения имени файла из заданного пути к файлу на языке программирования Python. Иногда во время автоматизации нам может понадобиться извлечь имя файла из пути к файлу.
Лучше знать:
- Модуль ОС Python
- Модуль пути Python
- Регулярные выражения
- Встроенный rsplit()
Метод 1:
Python OS-module Пример 1: Получить имя файла из пути без расширения split()Функция Python split() разбивает заданный текст на список строк, используя определенный разделитель, и возвращает список строк которые были разделены предоставленным разделителем.
Python3
импорт os путь = 'D:\home\Riot Games\VALORANT\live\VALORANT. exe' печать (os.path.basename(path).split( '/' )[ - 1 ]) |
Выход:
VALORANT.exeПример 2: Получить имя файла из пути к файлу с помощью os.path.basename
Базовое имя в заданном пути можно получить с помощью встроенной функции Python os.path.basename( ). Функция path.basename() принимает аргумент пути и возвращает базовое имя пути пути.
Python3
импорт os
file_path 9014 3 = 'C:/Users/test.txt'
имя_файла = os. path.basename(file_path)
print (file_name) |
Вывод:
test. txt
Пример 3: Получить имя файла из пути к файлу с помощью os.
splitextЭтот метод завершится файлом с расширением, но что, если нам нужно только имя файла без расширения или только расширения. Здесь на сцену выходит функция splitext в модуле os. Этот метод вернет кортеж строк, содержащих имя файла и текст, и мы можем получить к ним доступ с помощью индексации.
Пример:
Python3
импорт os
путь к файлу = 'C:/Users/test.txt'
имя_файла 9 0144 |
("тест", ". txt") test.txtМетод 2: Получить имя файла из пути к файлу с помощью Pathlib
Пакет Python Pathlib предлагает ряд классов, описывающих пути файловой системы с семантикой, подходящей для многих операционных систем. Стандартные служебные модули для Python включают этот модуль. Хотя стебель является одним из служебных атрибутов, который позволяет извлекать имя файла из ссылки без расширения, если нам нужно расширение с файлом, мы можем использовать атрибуты имени
Пример:
Python3
from pathlib import Path
file_path = 'C:/Users/test.txt'
печать (Путь(путь_к_файлу).ствол)
печать (Путь(путь_к_файлу).имя) 9000 3 |
Выход:
тест test. txtМетод 3: Получить имя файла из пути к файлу с помощью Регулярные выражения
Мы можем использовать регулярное выражение, чтобы сопоставить имя файла с определенным шаблоном.
Шаблон - [\w]+?(?=\.)
Этот шаблон разделен на 3 шаблона
- [\w] соответствует словам внутри набора
- +? соответствует строке, если она присутствует только один раз до ? ключевое слово
- (?=) соответствует всем символам без новой строки и не забудьте остановиться.
Пример:
Python3
импорт повторно 9 0003
file_path = 'C:/Users/test.txt' шаблон = '[\w-]+?(?=\.)'
a = re. search(pattern, file_path)
print (a.group()) |
Вывод:
900 50 testСпособ 4. Используйте встроенную функцию Python split() для разделения пути к файлу. в список отдельных компонентов, а затем используйте метод rsplit():
вы можете использовать встроенную функцию Python split(), чтобы разделить путь к файлу на список отдельных компонентов, а затем использовать метод rsplit() чтобы разделить последний компонент (который должен быть именем файла и расширением) в список, содержащий имя файла и расширение. Затем вы можете использовать индексацию для извлечения имени файла из этого списка.
Вот пример того, как это можно сделать:
Python3
def get_file_name(file_path): 90 143 file_path_components = file_path. split( ' /' ) file_name_and_extension = file_path_components[ - 901 43 1 ].rsplit( '.' , 1 ) возврат имя_файла_и_расширение[ 0 90 144 |