如何在 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
,这将会失败)
Is there a built-in function in Python that would replace (or remove, whatever) the extension of a filename (if it has one)?
Example:
print replace_extension('/home/user/somefile.txt', '.jpg')
In my example: /home/user/somefile.txt
would become /home/user/somefile.jpg
I don't know if it matters, but I need this for a SCons module I'm writing. (So perhaps there is some SCons specific function I can use ?)
I'd like something clean. Doing a simple string replacement of all occurrences of .txt
within the string is obviously not clean. (This would fail if my filename is somefile.txt.txt.txt
)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
尝试 os.path.splitext 它应该做你想做的想。
Try os.path.splitext it should do what you want.
扩展 AnaPana 的答案,如何使用 pathlib 删除扩展 a> (Python >= 3.4):
Expanding on AnaPana's answer, how to remove an extension using pathlib (Python >= 3.4):
正如 @jethro 所说,
splitext
是实现此目的的巧妙方法。但在这种情况下,您可以很容易地自行拆分它,因为扩展名必须是最后一个句点之后的文件名部分:rsplit
告诉 Python 执行字符串从字符串右侧开始拆分,1
表示最多执行一次拆分(例如'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
)。由于 rsplit 始终返回一个非空数组,因此我们可以安全地在其中索引 0 来获取减去扩展名的文件名。As @jethro said,
splitext
is the neat way to do it. But in this case, it's pretty easy to split it yourself, since the extension must be the part of the filename coming after the final period:The
rsplit
tells Python to perform the string splits starting from the right of the string, and the1
says to perform at most one split (so that e.g.'foo.bar.baz'
->[ 'foo.bar', 'baz' ]
). Sincersplit
will always return a non-empty array, we may safely index0
into it to get the filename minus the extension.我更喜欢使用以下单行方法 str.rsplit():
示例:
I prefer the following one-liner approach using str.rsplit():
Example:
处理多个扩展
如果您有多个扩展,使用
pathlib
和str.replace
可以解决以下问题:删除/剥离扩展
替换扩展
如果您还想要一个
pathlib
对象输出,那么你显然可以将行包装在Path()
中,将其全部包装在一个函数中
Handling multiple extensions
In the case where you have multiple extensions using
pathlib
andstr.replace
works a treat:Remove/strip extensions
Replace extensions
If you also want a
pathlib
object output then you can obviously wrap the line inPath()
Wrapping it all up in a function
TLDR:
在我看来,替换所有扩展的最佳方法如下。
更长的答案:
执行此操作的最佳方法取决于您的 python 版本以及需要处理的扩展数量。也就是说,我很惊讶没有人提到 pathlib 的
with_name
。我还担心这里的一些答案不能处理父目录中的.
。以下是完成扩展替换的几种方法。使用路径对象
替换最多一个扩展
替换最多两个扩展
使用pathlibs
with_name
替换所有扩展(我认为最好的解决方案):
使用
functools.reduce
和pathlib的with_suffix
:Python 3.9+ 使用pathlib和str.removesuffix:
不使用路径对象(仅字符串)
一般来说,我认为使用pathlib的解决方案更干净,但不是每个人都能做到这一点。如果您仍在使用 python 2,我很抱歉。如果你没有 python2 的 pathlib 包,我真的很抱歉。
使用
os.path
替换所有兼容 Python 2.7 的扩展:
Python 3.9+ 使用
removesuffix
和os.path
(如果你有 python3.9,为什么不使用pathlib
?):TLDR:
Best way to replace all extensions, in my opinion, is the following.
Longer Answer:
The best way to do this will depend on your version of python and how many extensions you need to handle. That said, I'm surprised nobody has mentioned pathlib's
with_name
. I'm also concerned that some answers here don't handle a.
in the parent directories. Here are several ways to accomplish extension replacement.Using Path Objects
Replace Up to One Extension
Replace Up to Two Extensions
Replace All Extensions
Using pathlibs
with_name
(best solution, in my opinion):Using
functools.reduce
and pathlib'swith_suffix
:Python 3.9+ Using pathlib and str.removesuffix:
Without Using Path Objects (Strings Only)
In general, I think solutions using pathlib are cleaner, but not everybody can do that. If you're still using python 2, I'm sorry. If you don't have the pathlib package for python2, I'm really sorry.
Replace All Extensions
Python 2.7 compatible using
os.path
:Python 3.9+ Using
removesuffix
andos.path
(if you have python3.9, why aren't you usingpathlib
?):另一种方法是使用
str.rpartition(sep)
方法。例如:
Another way to do is to use the
str.rpartition(sep)
method.For example:
对于 Python >= 3.4:
For Python >= 3.4:
使用 f 字符串:
Use f-strings:
最简单的方法:
The simplest way to do it: