Как заменить (или удалить) расширение из имени файла в Python? - PullRequest
75 голосов
/ 23 августа 2010

Есть ли в 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)

Ответы [ 7 ]

107 голосов
/ 23 августа 2010

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

import os
print os.path.splitext('/home/user/somefile.txt')[0]+'.jpg'
42 голосов
/ 17 февраля 2017

Расширяя ответ AnaPana, как удалить расширение, используя 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
27 голосов
/ 23 августа 2010

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

4 голосов
/ 18 ноября 2016

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

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

Пример:

>>> my_filename = '/home/user/somefile.txt'
>>> my_filename.rsplit('.', 1)
>>> ['/home/user/somefile', 'txt']
3 голосов
/ 10 февраля 2017

для 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'
3 голосов
/ 17 декабря 2013

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

Например:

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

new_filename = prefix + '.jpg'

print new_filename
0 голосов
/ 28 июня 2019

Обработка нескольких расширений

В случае, если у вас есть несколько расширений, этот однострочник, используя pathlib и str.replace, обрабатывает:

Удаление / удаление расширений

>>> from pathlib import Path
>>> p = Path("/path/to/myfile.tar.gz")
>>> str(p).replace("".join(p.suffixes), "")
'/path/to/myfile'

Заменить расширения

>>> p = Path("/path/to/myfile.tar.gz")
>>> new_ext = ".jpg"
>>> str(p).replace("".join(p.suffixes), new_ext)
'/path/to/myfile.jpg'

Если вам также нужен вывод объекта pathlib, тогда вы, очевидно, можете заключить строку в Path()

>>> Path(str(p).replace("".join(p.suffixes), ""))
PosixPath('/path/to/myfile')
...