2010-08-23 24 views
47

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

例子:

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

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

我不知道它的问题,但我需要这样一个SCons的模块,我写。 (所以也许有一些SCONS的具体功能我可以使用?)

我想要的东西干净。做一个简单的字符串替换字符串内的所有事件.txt显然是不干净的。 (如果我的文件名是somefile.txt.txt.txt

+1

可能的重复[在Python中提取文件名中的扩展名](http://stackoverflow.com/questions/541390/extracting-extension-from-filename-in-python) – 2010-08-23 15:55:40

+0

SCons允许获取操作字符串中的文件库。你能发布你的scons特定的逻辑吗?这是行动,发射器,扫描仪? – bdbaddog 2015-11-01 03:00:49

回答

81

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

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

@ereOn:另外,未来,请先尝试搜索。它对于回答这些标准问题更有效。 – 2010-08-23 15:55:07

+3

@ S.Lott:相信我与否。但我做到了。我经常做。也许是错误的。 – ereOn 2010-08-23 16:05:57

+0

@ereOn:由于你的问题几乎使用了完全相同的措词,所以我有点惊讶,你没有找到它。你的问题有5个字 - 连续 - 恰好匹配。 – 2010-08-23 16:09:02

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 2010-08-23 15:00:31

+6

请注意,对于以点开头且没有其他扩展名的文件(如Linux上的隐藏文件,例如'.bashrc'),使用rsplit会导致不同的结果。 'os.path.splitext'为这些返回一个空的扩展名,但是使用'rsplit'将把整个文件名作为扩展名。 – 2012-01-24 11:11:52

+1

这也会给文件名'/ home/john.johnson/somefile'带来意想不到的结果。 – 2016-11-13 10:26:06

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',则失败。 – 2017-05-18 09:05:28

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

我认为JS提出的pathlib方法。简单得多。 – h0b0 2017-08-17 09:47:17

13

扩展在观息的回答,如何除去使用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
/一些/路径/ somefile

+3

对于Python 3.x,这应该是答案pathlib是未来... – jlandercy 2017-03-29 09:10:05

相关问题