Python:替代__contains__的方案?基于文件名特征的文件处理优化咨询
关于Python文件名匹配的优化方案
首先得给你澄清个小误区:咱们平时写的"<string>" in filename这种判断,本质上就是在调用字符串的__contains__方法——所以别人说“不要用这个方法”,大概率是针对特定场景的顾虑,不是说这个方法本身不好。比如如果你的固定字符串可能和文件名里其他无关内容意外匹配,或者你需要更精确的匹配规则(比如只匹配前缀、后缀),这时候直接用in(也就是__contains__)可能会不符合预期,但如果你的需求就是“只要文件名里包含这个固定字符串就处理”,那它其实是最简洁高效的写法之一。
回到你的需求,优化前三行代码,我给你几个不同场景的替代方案,你可以根据自己的实际情况选:
1. 简单子串匹配(和原__contains__效果一致)
除了in,你也可以用str.find(),但本质逻辑没区别,只是写法稍有不同:
if filename.find("你的固定字符串") != -1:
不过这个写法反而不如in直观,除非你需要获取子串在文件名里的位置,否则没必要换。
2. 精确匹配场景(这可能是别人不推荐__contains__的原因)
如果你的需求不是“包含子串”,而是更明确的规则,比如:
- 匹配文件名以固定字符串开头:用
startswith()if filename.startswith("你的固定字符串"): - 匹配文件名以固定字符串结尾:用
endswith()if filename.endswith("你的固定字符串"): - 匹配文件名里的独立单词(比如不想把"weeklyreport"当成包含"report"):可以用正则表达式
这里的import re if re.search(r"\b你的固定字符串\b", filename):\b是正则里的单词边界,确保匹配的是独立的单词。
3. 更现代优雅的文件遍历写法(推荐!)
如果你想让代码更清晰、更易维护,推荐用Python 3.4+自带的pathlib模块,它比传统的os.listdir更友好,还能直接处理路径相关的操作:
from pathlib import Path # 替换成你的目标文件夹路径 target_folder = Path("./你的文件夹路径") # 遍历文件夹里的所有条目 for item in target_folder.iterdir(): # 先判断是不是文件(避免处理子文件夹),再检查文件名 if item.is_file() and "你的固定字符串" in item.name: # 这里可以直接用item来操作文件,比如item.read_text()读取内容 print(f"处理文件:{item.name}")
这个写法不仅能规避很多路径处理的坑,代码可读性也更高,适合非计算机专业的同学快速上手。
总结
如果你的需求就是“只要文件名包含固定字符串就处理”,那原来的in(也就是__contains__)完全没问题,没必要强行替换。别人说不要用它,大概率是担心你遇到精确匹配的场景时用错方法。你可以根据自己的实际匹配规则,选择上面对应的方案就行~
内容的提问来源于stack exchange,提问作者physlexic
相关产品推荐
相关产品推荐

