最近在工作时有一个需求:获取文件名,不含文件名后缀。我很轻松地想到了使用python的内置函数strip来实现,然而这一举动带来一个严重BUG,导致DEBUG好几天。特此记录,避免再次踩坑。
使用python的内置函数strip来去除文件名后缀在大部分场景下是可以的:
s = "abc.md"
s_name = s.strip('.md') # s_name = 'abc'
但当有以下情况的话就会出现问题:
s = "abcmd.md"
s_name = s.strip('.md') # s_name = 'abc'
我们期望的是abcmd
,但得到的结果却是abc
。
一直以来我以为strip
函数是去除左右两边的指定符号。但再看官方文档的解释:
返回原字符串的副本,移除其中的前导和末尾字符。 chars 参数为指定要移除字符的字符串。 如果省略或为 None,则 chars 参数默认移除空白符。 实际上 chars 参数并非指定单个前缀或后缀;而是会移除参数值的所有组合。
也就是说,.md
其实是被分为.
,m
,d
,.m
,.d
,md
,.md
。只要字符两边有匹配结果就会去除。
要想实现去除文件末尾的后缀名,Python 3.7
提供了新的函数以供使用:
str.removesuffix
: 去除字符串后缀匹配字符str.removeprefix
: 去除字符串前缀匹配字符s = "abcmd.md"
s_name = s.removesuffix(".md") # s_name = 'abcmd'
在Python 3.7之前则需要自己实现一个方法来实现此功能:
方法一:
s = "abcmd.md"
if s.endswith('.md'):
s = s[:-3] # 移除后缀 '.md'
print(s) # 输出 "abcmd"
# 进一步封装成通用函数
def remove_suffix(text, suffix):
if text.endswith(suffix):
return text[:-len(suffix)]
return text
方法二:
import os
s = "abcmd.md"
s = os.path.splitext(s)[0] if s.endswith('.md') else s
print(s) # 输出 "abcmd"
基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建