Как заменить (или удалить) расширение из имени файла в 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 57

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']

Для Python >= 3.4:

from pathlib import Path

filename = '/home/user/somefile.txt'

p = Path(filename)
new_filename = p.parent.joinpath(p.stem + '.jpg') # PosixPath('/home/user/somefile.jpg')
new_filename_str = str(new_filename) # '/home/user/somefile.jpg'