Как заменить (или удалить) расширение из имени файла в 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 ответов
попробовать os.путь.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'
на 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
Я предпочитаю следующий однострочный подход, используя .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'