You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的match case结合endswith()按文件后缀分类文件?

问题解答

1. 正确使用match case匹配文件后缀的方式

你原来的写法存在问题,Python的match语句是匹配表达式的值,不能直接把endswith()作为匹配目标。这里提供两种合理的写法:

写法一:用守卫条件直接判断文件名

利用case后的if子句调用endswith(),同时endswith()支持传入元组匹配多个后缀,无需写多个条件或运算:

import os

for file in os.listdir(dirpath):
    filename = os.fsdecode(file)
    match filename:
        case fn if fn.endswith(('.jpg', '.jpeg')):
            doSomething(fn)
        case fn if fn.endswith('.mp4'):
            somethingElse(fn)
        case _:
            doDefault(filename)

写法二:先提取文件后缀,再匹配后缀

通过os.path.splitext()提取后缀,统一转成小写避免大小写问题(比如.JPG或.JPEG),再直接匹配后缀字符串,这种写法更贴合match case的模式匹配设计:

import os

for file in os.listdir(dirpath):
    filename = os.fsdecode(file)
    _, ext = os.path.splitext(filename)
    ext = ext.lower()  # 统一后缀为小写,兼容不同大小写的后缀
    match ext:
        case '.jpg' | '.jpeg':
            doSomething(filename)
        case '.mp4':
            somethingElse(filename)
        case _:
            doDefault(filename)

2. 关于match语句中传入函数参数的问题

你不能像示例里那样把字符串参数直接传入match的函数调用里。match后面必须是一个可计算出具体值的表达式,比如match filename是匹配这个字符串的值;而你原代码里的match filename.endswith()会调用无参数的endswith(),返回False,完全不符合你的需求。

所有条件判断逻辑应该放在case的守卫条件里,或者先处理出要匹配的目标值(比如提取后的后缀),再进行模式匹配。

3. match case vs elif:哪种更适合这个场景?

两种写法都可行,没有绝对的优劣:

  • 如果用提取后缀后匹配的match case写法,代码结构更清晰,模式匹配的意图更明确;
  • 如果用elif,写法更符合多数人的传统编程习惯,对于简单的条件判断,可读性也不差。

如果需要分类的后缀类型很多,两种写法的维护成本相近;如果只是少数几种后缀,选你自己看着顺眼的写法即可。

内容的提问来源于stack exchange,提问作者Mave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:12:38