Удаление расширения имени файла через Python
Писал скрипт частью функционала которого является добавление к файлу второго расширения. Было например file.txt и стало file.txt.lol . Второй скрипт должен стереть второе расширение чтобы обратно стало file.txt . Как это можно реализовать?
os.rename(file.txt, file.txt + ".lol")
Отслеживать
user448066
задан 1 июл 2021 в 18:27
37 1 1 серебряный знак 5 5 бронзовых знаков
1 июл 2021 в 18:40
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
from os import path name = 'file.txt.lol' no_lol, lol = path.splitext(name) # В первую переменную попадет 'file.txt', во вторую - '.lol'
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 элементов (если разделитель не будет найден, то первые два элемента будут пустыми строками).
Как убрать расширения в конце названий файлов (.jpeg, .mp3 и т. д.)?
Нажимаем свойства папак, и там будет такая графа показывать расшерения файлов нажимаем да, и после этого выбирае файл и меняем расширения вот так вот например: фото1.jpeg после точки и есть расширения файла можно поменять вот так после точки фото1.tiff
через программу Total Commander, программа файловый менеджер, умеет и групповое переименование делать и форматировать разделы и копировать с одного места в другое и архивировать и еще много чего
открой сервис. свойства папки. поставь или сними там галочку показывать расширения для зарегистрированных типов файлов. (или как то так)
Найти файлы с расширением и удалить расширение из названия
Подсунули мне тут завирусованный комп с виндой на борту, где «вирус» подобавлял расширения «.blahblah» к имени файла.
find . -name ".blahblah"
файлы успешно находит. Что подсунуть в команду, чтоб условный «*.jpeg.blahblah» превратился в «*.jpeg»?

dvrts ★★★
01.02.15 21:16:47 MSK
anonymous
( 01.02.15 21:17:42 MSK )
Ответ на: комментарий от anonymous 01.02.15 21:17:42 MSK

Очевидно, но нельзя — файлы важные и как водится, без бекапа
dvrts ★★★
( 01.02.15 21:24:48 MSK ) автор топика

kir@localhost ~/test/test_to_rm $ ls photo.jpg photo.jpg.blahblah kir@localhost ~/test/test_to_rm $ find . -name ".blahblah" kir@localhost ~/test/test_to_rm $ find . -name "*.blahblah" ./photo.jpg.blahblah kir@localhost ~/test/test_to_rm $ find . -name "*.blahblah"|sed -e 's/\.blahblah//' ./photo.jpg kir@localhost ~/test/test_to_rm $ ls photo.jpg photo.jpg.blahblah kir@localhost ~/test/test_to_rm $ for i in `find . -name "*.blahblah"`; do mv $i $(ls $i|sed -e 's/\.blahblah//'); done kir@localhost ~/test/test_to_rm $ ls photo.jpg kir@localhost ~/test/test_to_rm $
kir64 ★★
( 01.02.15 21:27:18 MSK )

find $PATH -name «*.blahblah» | while read a; do (допишешь сам комбинацию с sed + mv); done
reprimand ★★★★★
( 01.02.15 21:28:32 MSK )
Ответ на: комментарий от reprimand 01.02.15 21:28:32 MSK

надо же, меня опередили! 🙂 да еще и с рабочим примером
reprimand ★★★★★
( 01.02.15 21:29:10 MSK )
Ответ на: комментарий от dvrts 01.02.15 21:24:48 MSK


Раз важные, сначала замени в моём варианте mv на cp, потом если всё ок — прогонишь rm по маске, как и проповедует anonymous выше.
kir64 ★★
( 01.02.15 21:30:15 MSK )
#!/bin/bash if [ $# == 0 ]; then find . -name '*.blahblah' -exec $0 <> \; else echo mv "$1" "$" fi
anonymous
( 01.02.15 21:31:13 MSK )
Ответ на: комментарий от kir64 01.02.15 21:27:18 MSK
а если по делу, тогда тут:
sed -e 's/\.blahblah//'
sed -e 's/\.blahblah$//'
anonymous
( 01.02.15 21:33:05 MSK )
Ответ на: комментарий от anonymous 01.02.15 21:33:05 MSK

kir@localhost ~/test/test_to_rm $ ls photo.jpg photo.jpg.blahblah photo.jpg.blahblah.somethingelse kir@localhost ~/test/test_to_rm $ find . -name "*.blahblah" ./photo.jpg.blahblah kir@localhost ~/test/test_to_rm $ find . -name "*.blahblah*" ./photo.jpg.blahblah.somethingelse ./photo.jpg.blahblah kir@localhost ~/test/test_to_rm $ for i in `find . -name "*.blahblah"`; do mv $i $(ls $i|sed -e 's/\.blahblah//'); done kir@localhost ~/test/test_to_rm $ ls photo.jpg photo.jpg.blahblah.somethingelse kir@localhost ~/test/test_to_rm $
kir64 ★★
( 01.02.15 21:36:04 MSK )
Ответ на: комментарий от kir64 01.02.15 21:36:04 MSK
да ты просто не поверишь, но:
$ touch "qwe.blahblah.asd.blahblah" $ find . -name "*.blahblah" | sed -e 's/\.blahblah//' ./qwe.asd.blahblah
anonymous
( 01.02.15 21:39:24 MSK )
Ответ на: комментарий от kir64 01.02.15 21:27:18 MSK

Все хорошо, но во многих директориях высыпает ошибки вида:
ls: cannot access Files/K-Lite: No such file or directory
cp: missing destination file operand after ‘Files/K-Lite’
Try ‘cp —help’ for more information.
С mv аналогично.
dvrts ★★★
( 01.02.15 21:39:54 MSK ) автор топика
Ответ на: комментарий от anonymous 01.02.15 21:39:24 MSK

Ох ты ж, об этом я не подумал, ты прав. Надеюсь, если ТС уже запустил однострочник, ему не попадется такая ситуация.
kir64 ★★
( 01.02.15 21:42:49 MSK )
Ответ на: комментарий от kir64 01.02.15 21:42:49 MSK

Не попадется, но есть проблема выше, подозреваю с путями
dvrts ★★★
( 01.02.15 21:43:37 MSK ) автор топика
Ответ на: комментарий от dvrts 01.02.15 21:39:54 MSK

YAR ★★★★★
( 01.02.15 21:43:54 MSK )
Ответ на: комментарий от dvrts 01.02.15 21:39:54 MSK
mv $i $(ls $i|sed -e 's/\.blahblah//')
поменяй на эту:
echo mv "$i" "$"
потом убери echo
anonymous
( 01.02.15 21:44:07 MSK )
Ответ на: комментарий от YAR 01.02.15 21:43:54 MSK

dvrts ★★★
( 01.02.15 21:45:17 MSK ) автор топика
Ответ на: комментарий от dvrts 01.02.15 21:43:37 MSK

Не с путями, а с пробелами в имени.
kir64 ★★
( 01.02.15 21:49:33 MSK )
Ответ на: комментарий от dvrts 01.02.15 21:45:17 MSK

На пост выше уже привели исправленный пример
YAR ★★★★★
( 01.02.15 21:50:31 MSK )
rename 's/.blahblah//gi' ./*.blahblah
Dron ★★★★★
( 01.02.15 21:50:37 MSK )
Последнее исправление: Dron 01.02.15 21:50:45 MSK (всего исправлений: 1)
Ответ на: комментарий от YAR 01.02.15 21:50:31 MSK

for i in `find . -name "*.blahblah"`; do mv "$i" "$"; done
dvrts ★★★
( 01.02.15 21:54:38 MSK ) автор топика
Ответ на: комментарий от dvrts 01.02.15 21:54:38 MSK

find . -name "*.blahblah" | while read file ; do mv "$" "$" ; done
На что ругается-то хоть?
YAR ★★★★★
( 01.02.15 21:58:56 MSK )
Ответ на: комментарий от dvrts 01.02.15 21:54:38 MSK

UPD: //slowpoke, выше уже ответили верно
kir@localhost ~/test/test_to_rm $ ls file with spaces in filename.jpg file with spaces in filename.jpg.blahblah kir@localhost ~/test/test_to_rm $ ls -l итого 0 -rw-r--r-- 1 kir kir 0 фев 1 21:44 file with spaces in filename.jpg -rw-r--r-- 1 kir kir 0 фев 1 22:20 file with spaces in filename.jpg.blahblah kir@localhost ~/test/test_to_rm $ find . -type f -name '*.blahblah' | while read file; do mv "$file" "$"; done kir@localhost ~/test/test_to_rm $ ls -l итого 0 -rw-r--r-- 1 kir kir 0 фев 1 22:20 file with spaces in filename.jpg kir@localhost ~/test/test_to_rm $
kir64 ★★
( 01.02.15 22:22:25 MSK )
Последнее исправление: kir64 01.02.15 22:23:45 MSK (всего исправлений: 1)
Ответ на: комментарий от kir64 01.02.15 22:22:25 MSK
Яйца отрывать тем, кто допускает пробелы в именах файлов!
покупка

Вот список имен файлов, включая расширения, как вы можете удалить расширения из имен файлов, как показано ниже. В этом руководстве представлена формула для решения этой задачи, а также объясняются аргументы формулы и то, как формула работает в Excel.
Общая формула:
| =LEFT(filename,FIND(«.»,filename)-1) |
аргументы
| Filename: the text string you want to remove the extension from. |
Возвращаемое значение
Формула возвращает содержимое ячейки без расширения.
Как работает эта формула
Пример: Чтобы удалить расширение из имен файлов в столбце B3: B5, используйте приведенную ниже формулу в C3: C5.
| =LEFT(B3,FIND(«.»,B3)-1) |

Нажмите Enter клавиши, чтобы получить результат в C3, затем перетащите дескриптор заполнения в C5.
объяснение
FIND(«.»,B3) : НАЙТИ функция возвращает позицию определенного символа. Здесь эта формула получает позицию символа «.».
=LEFT(B3,FIND(«.»,B3)-1) : ЛЕВЫЙ функция извлекает текст из левой части текстовой строки. Здесь шаги расчета этой формулы будут показаны ниже:
=LEFT(B3,FIND(«.»,B3)-1)
=LEFT(B3,6-1)
=LEFT(B3,5)
Что возвращает пять символов в левой части текстовой строки в ячейке B3.
замечание

Если в ячейке есть два или более имен файлов с расширениями, эта формула возвращает только первое имя файла. Смотрите скриншот:
Файл примера
Относительные формулы
- Найдите наиболее востребованный текст с критериями
В некоторых случаях вам может потребоваться найти наиболее часто встречающийся текст на основе критерия в Excel. В этом руководстве вводится формула массива для выполнения этой задачи и дается объяснение аргументов этой формулы. - Объединить ячейки запятыми
Здесь в этом руководстве представлены некоторые формулы для объединения нескольких ячеек в одну с запятой в качестве разделителя, как показано на скриншоте ниже, а также объясняется, как формулы работают в Excel. - Сделать текст одинаковой длины
Если есть список текстов разной длины, чтобы выглядеть лучше, вы можете сделать этот текст одинаковой длины, добавив завершающие символы, как показано на скриншоте ниже. Здесь представлена формула, которая объединяет функции LEN и REPT для обработки в Excel. - Проверить, содержит ли ячейка номер
Иногда вам может потребоваться проверить, содержит ли ячейка числовые символы. В этом руководстве представлена формула, которая вернет ИСТИНА, если ячейка содержит число, и ЛОЖЬ, если ячейка не содержит числа.