Удаление расширения имени файла через Python
Писал скрипт частью функционала которого является добавление к файлу второго расширения.
Было например file.txt и стало file.txt.lol.
Второй скрипт должен стереть второе расширение чтобы обратно стало file.txt.
Как это можно реализовать?
os.rename(file.txt, file.txt + ".lol")
Ответы (2 шт):
Если Вы изначальное знаете название файла и оно статично, тогда ссылка Вам подойдёт. В другом случае, когда "file.txt" будет постоянно отличаться, советую Вам написать код, который будет забирать все файлы в указанной папке (директории) и парсить название, например.
import os
aa = 'test.txt.lol'
spl = aa.split('.')
for i in spl:
if i == 'lol':
spl.remove(i)
aa = '.'.join(spl)
где аа - это ваше название файла, которое вы уже можете применять в коде по ссылке в комментарии.
Средствами os.path:
from os import path
name = 'file.txt.lol'
no_lol, lol = path.splitext(name) # В первую переменную попадет 'file.txt', во вторую - '.lol'
Средствами pathlib:
from pathlib import Path
path = Path('file.txt.lol')
print(path.stem) # Выведет file.txt (имя файла без расширения)
print(path.suffix) # Выведет .lol
Еще вариант, когда есть путь (а не просто имя файла), нужно убрать расширение:
from pathlib import Path
path = Path('somedir/file.txt.lol')
print(str(path.with_suffix('')) # Выведет somedir/file.txt
# Стандартные функции Python умеют работать с объектами Path
# Переименовать файл из somedir/file.txt.lol в somedir/file.txt
os.rename(path, path.with_suffix(''))
Дальше варианты через методы строки, но тут нужно быть аккуратным, т.к. строка не понимает, что внутри нее путь, и с точки зрения строки 'some.path/file' часть 'path/file' внезапно может оказаться расширением, в то время как функции из os.path и pathlib поймут, где часть пути, а где расширение.
Средствами str.rpartition (разбить по самому правому разделителю):
name = 'file.txt.lol'
name, dot, lol = name.rpartition('.') # name='file.txt', dot='.', lol='lol'
Это примерно аналогично str.rsplit с maxsplit=1:
name = 'file.txt.lol'
name, lol = name.rsplit('.', maxplit=1)
Единственно, rsplit вернет список из 1 элемента, если точки нет (из-за этого присваивание в две переменные упадет с ошибкой), а rpartition всегда возвращает кортеж из 3 элементов (если разделитель не будет найден, то первые два элемента будут пустыми строками).