如何用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
相关产品推荐
相关产品推荐

