Удаление или замена расширения файла в Python: решения
Быстрый ответ
Если вам требуется удалить расширение файла, воспользуйтесь функцией os.path.splitext()
из модуля os
:
import os
name_without_ext = os.path.splitext('example.txt')[0]
Таким образом, имя файла преобразуется в 'example'
, и он теперь не имеет расширения.
Решение очевидное: использование os.path.splitext()
Работа с несколькими расширениями в имени файла
Если имя файла содержит несколько расширений, например .this.that
, функция os.path.splitext()
успешно удаляет их все:
import os
filename = "archive.tar.gz"
while '.' in filename:
filename = os.path.splitext(filename)[0]
# Итоговое имя: 'archive'.
Совет для пользователей SCons
Те, кто используют SCons для сборки проектов, также найдут применение для os.path.splitext()
:
import os
env = Environment()
filename = 'source.c'
name_without_ext = os.path.splitext(filename)[0]
object_file = env.Object(target=name_without_ext, source=filename)
Пользуемся современными методами: приветствуем pathlib
Используйте модуль pathlib
из Python 3.4+ для объектно-ориентированной работы с файлами.
Удаляем расширение с помощью pathlib
from pathlib import Path
name_without_ext = Path('example.txt').with_suffix('') # расширение удалено
Заменяем старое расширение на новое
from pathlib import Path
new_name = Path('example.txt').with_suffix('.new_extension') # заменяем расширение на новое
Создаем функцию для гибкого управления расширением файла
from pathlib import Path
def replace_ext(filename, new_extension=''):
return Path(filename).with_suffix(new_extension)
new_name = replace_ext('example.txt', '.bak') # теперь файл имеет расширение '.bak'
Такая функция позволяет эффективно управлять расширениями файлов.
Встречаем препятствия и преодолеваем их
Работаем с файлами без расширений
import os
filename = "README"
name, extension = os.path.splitext(filename)
# name будет 'README', а extension останется пустым, так как нет расширения
Обрабатываем имена файлов с несколькими точками
Имена файлов вида 'my.file.name.txt'
могут вызвать затруднения, но проблема решается так:
filename = 'my.file.name.txt'
name_without_ext = filename.rsplit('.', 1)[0]
# Получаем 'my.file.name', сохраняя все промежуточные точки
Удаляется только последнее расширение, остальные точки остаются на месте.
Для проверки корректности работы используем утверждения
assert replace_ext('example.txt', '.bak') == 'example.bak'
assert replace_ext('archive.tar.gz', '.bz2') == 'archive.tar.bz2'
Утверждения помогают проверить правильность работы функций и избежать ошибок.
Визуализация
Возможно, будет полезно представить процесс преобразования имени файла как цепочку преобразований, где каждый шаг приближает нас к итоговому имени:
Имя файла: [document]🔗[report]🔗[v1]🔗[📄.pdf]
При применении os.path.splitext()
получаем:
os.path.splitext('document_report_v1.pdf')[0];
Результат преобразования:
Изначальное имя: [document]🔗[report]🔗[v1]🔗[📄.pdf]
Итоговое имя: [document]🔗[report]🔗[v1]
Полезные материалы
- os.path — Работа с путями файлов — Документация Python 3.12.2 — Официальная документация о манипуляциях с путями файлов в Python.
- Извлечение расширения файла в Python – Stack Overflow — Полезные советы от опытных разработчиков о работе с расширениями файлов.
- Методы строк в Python – GeeksforGeeks — Обзор всех методов работы со строками в языке Python.
- pathlib — Объектно-ориентированные пути в файловой системе — Документация Python 3.12.2 — Ознакомьтесь с
pathlib
, современным инструментом для работы с файлами.