Получение имени файла из полного пути: практические советы и варианты

Раздел: Основы Python -> Pandas

Основной метод: os.path.basename

Наиболее простой и распространённый способ получения имени файла из пути в Python предполагает использование функции os.path.basename из модуля os.path. Эта функция принимает строку с путём и возвращает последний компонент пути, то есть имя файла (или последнюю папку, если путь заканчивается на неё).

import os

path = '/home/user/documents/report.pdf'
filename = os.path.basename(path)
print(filename)  # report.pdf

обработка больших данных python (обработка больших данных в python)

Функция корректно обрабатывает как Unix-пути (с косой чертой), так и Windows-пути (с обратной косой чертой), автоматически определяя разделитель в зависимости от операционной системы. Это делает её кроссплатформенным решением.

Какие проблемы возникают при использовании os.path.basename?

  • Путь заканчивается разделителем: если передан путь вида '/home/user/documents/', os.path.basename вернёт пустую строку, так как последний компонент пуст. Перед вызовом рекомендуется удалять завершающий разделитель.
  • Неверный разделитель в строке: если путь содержит смешанные разделители (например, 'home/user\\file.txt'), результат может быть неожиданным. Следует использовать нормализацию пути с помощью os.path.normpath.
  • Работа с URL: для веб-адресов os.path.basename неприменим, так как модуль os.path ожидает локальный путь.

Варианты решения задачи

Как получить имя файла, используя объектно-ориентированный подход (pathlib)?

Модуль pathlib, начиная с Python 3.4, предоставляет класс Path с атрибутом name. Этот способ считается более современным и читаемым.

from pathlib import Path

path = Path('/home/user/documents/report.pdf')
filename = path.name
print(filename)  # report.pdf

очистка данных python (очистка данных в python)

Ошибка возникает, если передать объект, не являющийся строкой (например, bytes) – конструктор Path ожидает строку или другой Path. Также pathlib не умеет напрямую обрабатывать URL.

Как извлечь имя файла без импорта модулей (только строковые методы)?

Если нет необходимости в дополнительных модулях, можно воспользоваться методом split() или rsplit() с указанием разделителя. Однако такой подход не кроссплатформенен.

path = '/home/user/documents/report.pdf'
# Для Unix-подобных систем
filename = path.split('/')[-1]
print(filename)  # report.pdf

Python подготовка данных (подготовка данных в python)

Основная проблема – жёстко заданный разделитель. Для Windows нужно использовать обратную косую черту. Решение – использовать os.sep или os.path.sep, что делает код переносимым, но тогда уже требуется импорт os.

Как получить имя файла с помощью регулярных выражений?

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

import re

path = '/home/user/documents/report.pdf'
pattern = r'[^/\\]+$'  # один или более символов, не являющихся / или \, до конца строки
match = re.search(pattern, path)
if match:
    filename = match.group()
    print(filename)  # report.pdf

работа с dataframe python (работа с dataframe в python)

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

Как получить имя файла из URL?

Для веб-адресов следует использовать модуль urllib.parse, который правильно разбирает URL и извлекает путь, а затем применить os.path.basename или pathlib.

from urllib.parse import urlparse
import os

url = 'https://example.com/download/file.pdf?version=2'
parsed = urlparse(url)
path = parsed.path
filename = os.path.basename(path)
print(filename)  # file.pdf

Python работа с большими данными (работа с большими данными в python)

Если URL содержит фрагменты (#) или некорректные символы, urlparse может вернуть неожиданный результат. Для кириллических имён файлов нужна дополнительная декодировка через unquote.

Как применить извлечение имени файла к столбцу DataFrame (Pandas)?

В библиотеке Pandas часто требуется вычленить имя файла из полного пути, хранящегося в колонке. Для этого применяют метод apply с лямбда-функцией, внутри которой используется os.path.basename или Path.name.

import pandas as pd
import os

df = pd.DataFrame({'full_path': [
    '/data/2024/file1.csv',
    '/data/2024/file2.csv',
    '/data/2025/file3.csv'
]})

df['filename'] = df['full_path'].apply(lambda x: os.path.basename(x))
print(df)

Проблемы возникают при наличии пропущенных значений (NaN). Лямбда-функция вызовет ошибку, если передать None. Решение – предварительная обработка: dropna() или условие внутри функции.

- Python код символа (код символа в python)
- код из файла python (код из файла python)
- обработка данных на python (обработка данных на python)

Расширенные примеры

Пример 1. Обработка различных операционных систем

Пример
import os
from pathlib import Path

paths = [
    '/home/user/file.txt',
    'C:\\Users\\user\\file.txt',
    '//server/share/file.txt',
    'relative/path/file.txt'
]

for p in paths:
    print(f"basename: {os.path.basename(p)}")
    print(f"pathlib:  {Path(p).name}")
    print()
basename: file.txt
pathlib:  file.txt

basename: file.txt
pathlib:  file.txt

basename: file.txt
pathlib:  file.txt

basename: file.txt
pathlib:  file.txt

Пример 2. Извлечение имени без расширения

Пример
import os
from pathlib import Path

path = '/home/user/report_v2.pdf'
# Через os.path
name_without_ext = os.path.splitext(os.path.basename(path))[0]
print(name_without_ext)  # report_v2

# Через pathlib
name_without_ext_pl = Path(path).stem
print(name_without_ext_pl)  # report_v2
report_v2
report_v2

Пример 3. Работа с Pandas: обработка пропусков

Пример
import pandas as pd
import os

df = pd.DataFrame({'full_path': [
    '/data/file1.csv',
    None,
    '/data/file3.csv'
]})

def safe_basename(x):
    if pd.isna(x) or not x:
        return None
    return os.path.basename(x)

df['filename'] = df['full_path'].apply(safe_basename)
print(df)
        full_path filename
0  /data/file1.csv  file1.csv
1             None      None
2  /data/file3.csv  file3.csv

Пример 4. Обработка путей с завершающим разделителем

Пример
import os

path = '/home/user/folder/'
# Прямой вызов basename вернёт пустую строку
print(repr(os.path.basename(path)))  # ''
# Удаляем завершающий разделитель
normalized = path.rstrip('/\\')
print(os.path.basename(normalized))  # folder
''
'folder'

Пример 5. Извлечение имени файла из списка путей с использованием map

Пример
import os

paths = ['/a/b/c.txt', '/d/e/f.py', '/g/h/i.jpg']
names = list(map(os.path.basename, paths))
print(names)  # ['c.txt', 'f.py', 'i.jpg']
['c.txt', 'f.py', 'i.jpg']

Пример 6. Строковый метод с использованием os.sep

Пример
import os

path = '/home/user/file.txt'
# os.sep равен '/' на Unix и '\\' на Windows
filename = path.rsplit(os.sep, 1)[-1]
print(filename)  # file.txt
file.txt

Пример 7. Регулярное выражение для путей с точками (без расширения)

Пример
import re

path = '/archive/2024/data.backup.tar.gz'
pattern = r'[^/\\]+(?=\.)'  # имя до первой точки (не включая точку)
match = re.search(pattern, path)
if match:
    print(match.group())  # data.backup
data.backup

Получение имени файла в Python - comments

En
Python get file name (python)