如何从Python中的文件名replace(或剥离)扩展?

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

例:

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

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

我不知道是否重要,但我需要这个我正在写的SCons模块。 (所以也许有一些SCons的具体function,我可以使用?)

我想要一些干净的东西。 做一个简单的stringreplacestring中的所有.txt显然是不干净的。 (如果我的文件名是somefile.txt.txt.txt这将失败)

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

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

正如@jethro所说, splitext是做这件事的好方法。 但是在这种情况下,自己分割它非常容易,因为扩展名必须是在最后一段时间之后的文件名的一部分:

 filename = '/home/user/somefile.txt' print( filename.rsplit( ".", 1 )[ 0 ] ) # '/home/user/somefile' 

rsplit告诉Python执行从string右边开始的string拆分,而1表示最多执行一个拆分(例如'foo.bar.baz' – > [ 'foo.bar', 'baz' ] )。 由于rsplit将总是返回一个非空的数组,我们可以安全地将0索引到它以获得文件名减去扩展名。

在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
/一些/path/ somefile

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

例如:

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

我更喜欢使用str.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'