Python中是否有内置函数可以替换(或删除)文件扩展名(如果有的话)?
示例:
print replace_extension('/home/user/somefile.txt', '.jpg')
在我的示例中:/home/user/somefile.txt
将成为/home/user/somefile.jpg
我不知道它是否重要,但我需要这个我正在编写的SCons模块。 (所以也许我可以使用一些SCons特定功能?)
我想要一些干净。对字符串中所有出现的.txt
进行简单的字符串替换显然不是很干净。 (如果我的文件名为somefile.txt.txt.txt
)
答案 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)
在具有多个扩展名的情况下,使用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')