Python编写邮箱分拣脚本无法正确分类有效/无效邮箱的问题排查
邮箱分拣代码错误排查与修复方案
原代码核心逻辑错误
- 变量误用:函数传入的参数
email实际是输入文件的路径,循环读取文件行的变量是line,但正则匹配、写文件时始终用的是文件路径字符串,完全没有对读取到的每一行邮箱内容做判断,本质是一直在校验"email-pack-1.txt"这个文件名是不是合法邮箱。 - 内容未清洗:
readlines()读取的每行内容末尾自带换行符,直接做正则匹配会导致合法邮箱因为末尾的换行符被误判为无效。 - 文件操作不规范:输出文件用
a+追加模式打开,之前运行产生的错误结果会残留到新文件里;所有打开的文件没有做关闭处理,极端情况会出现写入内容丢失;输入文件仅需读取权限,不需要用r+读写模式。 - 正则错误:字符组内的
|属于多余字符,原正则[A-Z|a-z]会把竖线|识别为域名的合法字符,不符合邮箱规则。 - 输出格式问题:写入结果时没有加换行符,所有邮箱会拼接成一整行,后续无法正常读取。
修正后可直接运行的代码
import re # 修正后的邮箱匹配正则 regex = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Za-z]{1,4})+') def classify_emails(input_file): # 用with上下文管理器自动处理文件开闭,输出文件用w模式每次覆盖旧结果避免脏数据 with open(input_file, 'r', encoding='utf-8') as f_in, \ open("good_email.txt", 'w', encoding='utf-8') as f_good, \ open("incorrect_emails.txt", 'w', encoding='utf-8') as f_bad: for line in f_in: # 去除每行首尾的空白、换行符,跳过空行 email = line.strip() if not email: continue if regex.fullmatch(email): f_good.write(f"{email}\n") print(f"有效: {email}") else: f_bad.write(f"{email}\n") print(f"无效: {email}") if __name__ == "__main__": classify_emails("email-pack-1.txt")
注意:如果你的邮箱源文件是GBK等其他编码,把代码里的
encoding='utf-8'替换为对应编码即可。
内容的提问来源于stack exchange,提问作者Basior
相关产品推荐
相关产品推荐

