August Rush

一个还在努力成长的小火汁!

游龙当归海,海不迎我自来也。

We create our own demons.

You can reach me at augustrush0923@gmail.com
记录Python去除文件后缀的一个bug
发布:2024年08月07日 | 作者:augustrush | 阅读量: 150

前言

最近在工作时有一个需求:获取文件名,不含文件名后缀。我很轻松地想到了使用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其实是被分为.md.m.dmd.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构建

京ICP备20007446号-1 & 豫公网安备 41100202000460号

网站地图 & RSS | Feed