Напишите программу которая заменяет расширение у заданного имени файла python
Перейти к содержимому

Напишите программу которая заменяет расширение у заданного имени файла python

  • автор:

Как заменить (или убрать) расширение из имени файла в Python?

Есть ли в Python встроенная функция, которая заменяет (или удаляет что угодно) расширение имени файла (если оно есть)?

В моем примере: /home/user/somefile.txt станет /home/user/somefile.jpg

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

Я бы хотел что-нибудь чистым. Выполнение простой замены строк всех вхождений .txt внутри строки явно не чистый. (Это не сработает, если мое имя файла somefile.txt.txt.txt )

SCons позволяет получить доступ к файловой базе в строке действия. Можете ли вы опубликовать конкретную логику вашего бра, которая в этом нуждается? Это для экшена, эмиттера, сканера? — bdbaddog

некоторые из них, похоже, больше не работают, поскольку path возвращает PosixPath, а не строку: p — shigeta

Python 3.9 позволит path.removesuffix(‘.txt’) + ‘.jpg’ , что, вероятно, будет самым простым способом продвижения вперед python.org/dev/peps/pep-0616 — panofsteel

8 ответы

Попытка os.path.splitext он должен делать то, что вы хотите.

ответ дан 30 окт ’15, 15:10

@ S.Lott: Верьте мне или нет. Но я сделал. Я всегда делаю. Возможно, с неправильными условиями. — перед

@ereOn: Поскольку в вашем вопросе используется почти такая же формулировка, я немного удивлен, что вы его не нашли. Ваш вопрос состоит из 5 слов подряд, которые точно совпадают. — С.Лотт

Только добавляйте новое имя вместе с os.path.join, чтобы оно выглядело чистым. — Тони Вейялайнен

@Tony Veijalainen: Вы не должны использовать os.path.join, потому что он предназначен для объединения компонентов пути с разделителем пути, зависящим от ОС. Например, print os.path.join(os.path.splitext(‘/home/user/somefile.txt’)[0], ‘.jpg’) вернется /home/user/somefile/.jpg , что нежелательно. — Скоттклоу

@ S.Lott — 99 человек, проголосовавших за этот ответ, довольно явно означают, что этот пост полезен, нет необходимости призывать к позору все заглавные буквы — ДжеффТомпсон

Расширяя ответ АнаПаны, как удаление расширение с использованием pathlib (Python> = 3.4):

В Real Python есть хорошая запись примеров использования модуля pathlib: realpython.com/python-pathlib — Стивен С. Хауэлл

Этот ответ является моим типичным подходом, но, похоже, он не работает, когда у вас есть несколько расширений файлов. Например, pth = Path(‘data/foo.tar.gz’); print(pth.with_suffix(‘.jpg’)) выведет ‘data/foo.tar.jpg’ . Я полагаю, ты можешь сделать pth.with_suffix(»).with_suffix(‘.jpg’) , но это неуклюже, и вам нужно будет добавить произвольно длинную цепочку .with_suffix(») звонки, чтобы иметь дело с произвольным количеством точек . в расширении файла (правда, больше 2 — экзотический крайний случай). — телефон

@tel Вы можете использовать while цикл, чтобы решить эту проблему: pth = Path(‘data/foo.tar.gz’); while pth != pth.with_suffix(»): pth = pth.with_suffix(»); pth = pth.with_suffix(‘.jpg’) — Дерик

Читать мой ответ ниже для решения проблемы множественных расширений. — Майкл Холл

Как сказал @jethro, splitext это изящный способ сделать это. Но в этом случае разбить его самостоятельно довольно просто, так как расширение должен быть часть имени файла, идущая после последней точки:

Напишите функцию, которая заменяет расширение файла на заданное новое расширение. Пример: Введите имя файла qq; Введите новое ра

Напишите функцию, которая заменяет расширение файла на заданное новое расширение.

Пример:
Введите имя файла qq;
Введите новое расширение: tmp;
Результат: qq.tmp

Ren name.* name.tmp

Вполне себе «функция». А язык Вы не указали, так что — кушайте, что дают.

//PascalABC.Net 3.0, сборка 1064
const
nn=50;
var
a:array[1..nn] of integer;
i,n,imin:integer;
begin
Write(‘Введите количество элементов в массиве: ‘); Read(n);
Randomize;
Writeln(‘Исходный массив’);
imin:=1;
for i:=1 to n do begin
a[i]:=Random(51)-25;
Write(a[i],’ ‘);
if a[i]<a[imin] then imin:=i;
end;
Writeln;
for i:=imin to n-1 do a[i]:=a[i+1];
Writeln(‘Массив-результат’);
for i:=1 to n-1 do Write(a[i],’ ‘); Writeln
end.

<em><u>Тестовое решение:</u></em>
Введите количество элементов в массиве: 15
Исходный массив
17 -3 22 18 -13 -5 5 -15 -18 23 17 -2 -20 23 2
Массив-результат
17 -3 22 18 -13 -5 5 -15 -18 23 17 -2 23 2

<em><u>А это версия для тех, кто думает, что Паскалю пора давно «на свалку»:</u></em>
//PascalABC.Net 3.0, сборка 1064
begin
var n:=ReadInteger(‘Введите количество элементов в массиве’);
var a:=SeqRandom(n,-25,25).ToArray();
Writeln(‘Исходный массив:’,#13#10,a);
Writeln(‘Результат:’,#13#10,a.Where(x->x<>a.Min));
end.

<em><u>Тестовое решение:</u></em>
Введите количество элементов в массиве 15
Исходный массив:
[-10,-15,8,-19,9,21,-22,-11,12,14,2,19,-25,-5,-15]
Результат:
[-10,-15,8,-19,9,21,-22,-11,12,14,2,19,-5,-15]

<em>Можно сравнить понятность кода и его размер как со «школьным» решением, так и с программой на Java, приведенной в предыдущем ответе.</em>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *