Как заменить (или удалить) расширение из имени файла в Python?
есть ли встроенная функция в Python, которая заменит (или удалит, что угодно) расширение имени файла (если оно есть) ?
пример:
print replace_extension('/home/user/somefile.txt', '.jpg')
в моем примере: /home/user/somefile.txt
станет /home/user/somefile.jpg
Я не знаю, имеет ли это значение, но мне это нужно для модуля SCons, который я пишу. (Так что, возможно, есть какая-то конкретная функция SCons, которую я могу использовать ?)
Я бы хотел кое-что очистить. Выполнение простой замены строки всех вхождения .txt
внутри строки явно не чисто. (Это не сработает, если мое имя файла somefile.txt.txt.txt
)
6 ответов:
попробовать ОС.путь.splitext он должен делать то, что вы хотите.
import os print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg'
расширяя ответ Анапаны, как удалить расширение с использованием pathlib (Python >= 3.4):
>>> from pathlib import Path >>> filename = Path('/some/path/somefile.txt') >>> filename_wo_ext = filename.with_suffix('') >>> filename_replace_ext = filename.with_suffix('.jpg') >>> print(filename) /some/path/somefile.ext >>> print(filename_wo_ext) /some/path/somefile >>> print(filename_replace_ext) /some/path/somefile.jpg
как сказал @jethro,
splitext
- это аккуратный способ сделать это. Но в этом случае, это довольно легко разделить его самостоятельно, так как расширение должно быть часть имени файла после заключительного периода:filename = '/home/user/somefile.txt' print( filename.rsplit( ".", 1 )[ 0 ] ) # '/home/user/somefile'
The
rsplit
говорит Python выполнить разбиение строки, начиная с правой части строки, и1
говорит, чтобы выполнить не более одного раскола (так что, например,'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
). Так какrsplit
всегда будет возвращать непустой массив, мы можем безопасно индекс0
в нем, чтобы получить имя файла без расширения.
другой способ сделать это, чтобы использовать
str.rpartition(sep)
метод.например:
filename = '/home/user/somefile.txt' (prefix, sep, suffix) = filename.rpartition('.') new_filename = prefix + '.jpg' print new_filename
Я предпочитаю следующий однострочный подход с использованием str.rsplit():
my_filename.rsplit('.', 1)[0] + '.jpg'
пример:
>>> my_filename = '/home/user/somefile.txt' >>> my_filename.rsplit('.', 1) >>> ['/home/user/somefile', 'txt']