邮件校验if语句编写及去重写入文本文件技术咨询
邮件校验与去重写入的正确实现
你的现有代码存在几个关键问题,比如判断邮件有效性的逻辑错误、字符串处理遗漏、重复检查效率低等,以下是修正后的完整代码,以及关键要点说明:
修正后的代码
from validate_email import validate_email import os def email_validator(): # 初始化计数变量,避免全局变量的潜在问题 success = 0 fails = 0 # 先读取已验证的邮件,存入集合用于快速去重检查 validated_emails = set() output_file = "./validated_emails.txt" if os.path.exists(output_file): with open(output_file, "r") as f: for line in f: email = line.strip() if email: validated_emails.add(email) # 读取待校验邮件列表 with open(os.path.join("./emails.txt"), "r") as f: for line in f: email = line.strip() # 跳过空行 if not email: continue print(f"checking email: {email}") # 执行邮件校验 is_valid = validate_email( email_address=email, check_format=True, check_blacklist=False, check_dns=True, dns_timeout=10, check_smtp=True, smtp_timeout=10, smtp_helo_host='my.host.name', smtp_from_address='my@from.addr.ess', smtp_skip_tls=False, smtp_tls_context=None, smtp_debug=False ) # 核心判断逻辑:邮件有效时处理写入 if is_valid: print(f'Email {email} is valid') success += 1 # 检查是否已存在,不存在则写入 if email not in validated_emails: with open(output_file, 'a') as f_out: f_out.write(email + '\n') validated_emails.add(email) # 更新集合,避免后续重复检查 else: print(f'Email {email} already exists in validated list') else: print(f'Email {email} is invalid') fails += 1 print(f"\nValidation complete: {success} valid emails, {fails} invalid emails") # 执行函数 email_validator()
关键修正点说明
- 正确判断邮件有效性:直接使用
is_valid变量(validate_email返回的布尔值),原代码中validate_email.__code__ == 200和validate_email == False都是错误的判断逻辑。 - 字符串处理:将
line.strip()赋值给email变量,避免原邮件行包含换行符或空白,导致写入和重复检查出错。 - 高效去重:用集合
validated_emails存储已验证邮件,集合的成员查找效率远高于字符串查找,同时初始化时读取已有邮件,避免每次写入都重新读取整个文件。 - 文件写入模式:使用
'a'(追加)模式写入,比'r+'更安全,不会意外覆盖已有内容,也无需处理文件指针位置。 - 计数逻辑修正:将
success和fails改为函数内局部变量,避免全局变量的潜在问题,同时确保计数只在对应条件下累加。
内容的提问来源于stack exchange,提问作者Pawel
相关产品推荐
相关产品推荐

