如何在Python中替换(或剥离)文件名中的扩展名?

时间:2010-08-23 14:49:26

标签: python scons

Python中是否有内置函数可以替换(或删除)文件扩展名(如果有的话)?

示例:

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

在我的示例中:/home/user/somefile.txt将成为/home/user/somefile.jpg

我不知道它是否重要,但我需要这个我正在编写的SCons模块。 (所以也许我可以使用一些SCons特定功能?)

我想要一些干净。对字符串中所有出现的.txt进行简单的字符串替换显然不是很干净。 (如果我的文件名为somefile.txt.txt.txt

,则会失败

8 个答案:

答案 0 :(得分:105)

尝试os.path.splitext它应该做你想做的事。

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

答案 1 :(得分:40)

扩展AnaPana的答案,如何使用pathlib 删除扩展程序(Python> = 3.4):

App.Current.MainPage

答案 2 :(得分:26)

正如@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索引到其中以获取文件名减去扩展名。

答案 3 :(得分:4)

我更喜欢使用str.rsplit()的以下单线方法:

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

示例:

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

答案 4 :(得分:3)

另一种方法是使用str.rpartition(sep)方法。

例如:

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

new_filename = prefix + '.jpg'

print new_filename

答案 5 :(得分:3)

对于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'

答案 6 :(得分:1)

我很惊讶没有人提到 pathlib 的 with_name。此解决方案适用于多个扩展(即替换所有扩展。)

import pathlib

p = pathlib.Path('/some/path/somefile.txt')
p = p.with_name(p.stem).with_suffix('.jpg')

答案 7 :(得分:-1)

处理多个扩展名

在具有多个扩展名的情况下,使用pathlibstr.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')