Есть ли в Python встроенная функция, которая могла бы заменить (или удалить что угодно) расширение имени файла (если оно есть)?
Пример:
print replace_extension('/home/user/somefile.txt', '.jpg')
В моем примере: /home/user/somefile.txt
станет/home/user/somefile.jpg
Не знаю, имеет ли это значение, но мне это нужно для модуля SCons, который я пишу. (Так, может быть, я могу использовать какую-то особую функцию SCons?)
Я хочу что-нибудь чистое . Совершенно .txt
очевидно, что простая замена всех вхождений внутри строки не является чистой. (Это не сработает, если мое имя файла somefile.txt.txt.txt
)
Ответы:
Попробуйте os.path.splitext, он должен делать то, что вы хотите.
источник
print os.path.join(os.path.splitext('/home/user/somefile.txt')[0], '.jpg')
вернется/home/user/somefile/.jpg
, что нежелательно.Расширяя ответ AnaPana, как удалить расширение с помощью pathlib (Python> = 3.4):
источник
pth = Path('data/foo.tar.gz'); print(pth.with_suffix('.jpg'))
выведет'data/foo.tar.jpg'
. Я полагаю, вы можете это сделатьpth.with_suffix('').with_suffix('.jpg')
, но это неуклюже, и вам нужно будет добавить произвольно длинную цепочку.with_suffix('')
вызовов, чтобы иметь дело с произвольным количеством точек.
в расширении файла (по общему признанию, более 2 - это экзотический крайний случай).while
цикл, чтобы решить эту проблему:pth = Path('data/foo.tar.gz'); while pth != pth.with_suffix(''): pth = pth.with_suffix(''); pth = pth.with_suffix('.jpg')
Как сказал @jethro,
splitext
это аккуратный способ сделать это. Но в этом случае довольно легко разделить его самостоятельно, поскольку расширение должно быть частью имени файла, идущей после последней точки:rsplit
Говорит Python для выполнения строки расколов , начиная с правой части строки, и1
говорит , что для выполнения более одного раскола (так что , например ,'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
). Посколькуrsplit
всегда будет возвращать непустой массив, мы можем безопасно индексировать0
его, чтобы получить имя файла без расширения.источник
rsplit
приведет к разным результатам для файлов, которые начинаются с точки и не имеют другого расширения (например, скрытые файлы в Linux.bashrc
).os.path.splitext
возвращает для них пустое расширение, но при использованииrsplit
все имя файла рассматривается как расширение./home/john.johnson/somefile
Я предпочитаю следующий однострочный подход с использованием str.rsplit () :
Пример:
источник
Для Python> = 3.4:
источник
Обработка нескольких расширений
В случае, если у вас есть несколько расширений, этот однострочник использует
pathlib
иstr.replace
работает:Удалить / удалить расширения
Заменить расширения
Если вам также нужен
pathlib
вывод объекта, вы, очевидно, можете обернуть строку вPath()
Обертывание всего этого в функции
источник
with_suffix
вместоreplace
будет только удалить,.gz
а не.tar.gz
Мой ответ должен был быть «общим», но если вы ожидаете только одного расширения,with_suffix
это будет более чистым решением.Другой способ - использовать этот
str.rpartition(sep)
метод.Например:
источник