2010-08-23 2 views
47

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

Пример:

print replace_extension('/home/user/somefile.txt', '.jpg') 

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

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

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

+1

возможный дубликат [Извлечение расширения из имени файла в Python] (http://stackoverflow.com/questions/541390/extracting-extension-from-filename-in-python) –

+0

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

ответ

81

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

import os 
print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg' 
+2

@ereOn: Кроме того, в будущем сначала попробуйте ПОИСК.Он работает намного лучше для ответа на эти стандартные вопросы. –

+3

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

+0

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

19

Как @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, чтобы получить имя файла за вычетом расширения.

+0

Спасибо за объяснения и обходной путь. – ereOn

+6

Обратите внимание, что использование 'rsplit' приведет к разным результатам для файлов, начинающихся с точки и не имеющих другого расширения (например, скрытых файлов в Linux, например' .bashrc'). 'os.path.splitext' возвращает пустое расширение для них, но использование' rsplit' будет обрабатывать все имя файла как расширение. –

+1

Это также даст неожиданные результаты для имени файла '/ home/john.johnson/somefile' –

3

Другой способ - использовать метод str.rpartition(sep).

Например:

filename = '/home/user/somefile.txt' 
(prefix, sep, suffix) = filename.rpartition('.') 

new_filename = prefix + '.jpg' 

print new_filename 
2

Я предпочитаю следующий однострочник подход с использованием str.rsplit():

my_filename.rsplit('.', 1)[0] + '.jpg' 

Пример:

>>> my_filename = '/home/user/somefile.txt' 
>>> my_filename.rsplit('.', 1) 
>>> ['/home/user/somefile', 'txt'] 
+0

Это не удается, если файл somefile не имеет расширения, а пользователь -« john.doe ». –

0

Для 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' 
+0

Я думаю, что подход pathlib, предложенный JS. намного проще. – h0b0

13

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

from pathlib import Path 

filename = Path('/some/path/somefile.ext') 

filename_wo_ext = filename.with_suffix('') 

print(filename) 
print(filename_wo_ext) 

/some/path/somefile.ext
/некоторый/путь/

некий-файл
+3

Для Python 3.x это должен быть ответ pathlib - это будущее ... – jlandercy