Python数据文件处理求助:提取20 Newsgroups数据集有效邮箱
解决20 Newsgroups数据集邮箱提取与统计任务
现有代码的问题分析
- 文件操作逻辑错误:在
main函数定义前就打开并关闭了文件,导致函数内调用infile.splitlines()时文件已关闭,触发IO错误。 str.find()用法错误:该方法第二个参数是搜索起始位置,无法同时判断行中是否包含@和.。- 未提取邮箱内容:仅打印包含目标字符的整行,没有从行中提取具体邮箱地址。
- 缺少核心功能:完全未实现去重、写入输出文件、标注字符数、统计总数和平均长度的任务要求。
修正后的完整代码
def main(): # 用集合自动实现邮箱去重 unique_emails = set() # 使用with语句自动管理输入文件的打开/关闭 with open("dataset.txt", "r") as infile: for line in infile: line = line.strip() # 先过滤包含@和.的行,再提取邮箱内容 if "@" in line and "." in line: # 拆分行内容,定位包含@的片段(适配"From: xxx@yyy.com"这类常见格式) for part in line.split(): if "@" in part and "." in part: # 去除邮箱前后可能的包裹标点(如<>、()、逗号等) email = part.strip(",<>()[]") # 基础格式校验:@不在首尾,且@之后存在. if email.startswith("@") or email.endswith("@"): continue at_pos = email.index("@") if "." not in email[at_pos+1:]: continue unique_emails.add(email) # 写入结果到输出文件 with open("emails.txt", "w") as outfile: # 按字母排序后写入每个邮箱及字符数 for email in sorted(unique_emails): char_count = len(email) outfile.write(f"{email} - 字符数: {char_count}\n") # 统计并写入总数与平均长度 total = len(unique_emails) if total > 0: avg_length = sum(len(email) for email in unique_emails) / total outfile.write(f"\n邮箱总数: {total}\n") outfile.write(f"邮箱平均长度: {avg_length:.2f}\n") else: outfile.write("\n未找到有效邮箱\n") if __name__ == "__main__": main()
关键功能说明
- 自动文件管理:
with语句确保文件在操作完成后自动关闭,避免资源泄漏。 - 去重处理:利用集合的唯一性特性,自动过滤重复邮箱。
- 邮箱提取与校验:拆分行内容定位邮箱片段,去除无关标点,并做基础格式校验,避免无效字符串被误判为邮箱。
- 结果输出:排序后写入邮箱及字符数,最后统计总数和平均长度,无有效邮箱时给出提示。
内容的提问来源于stack exchange,提问作者user9223978
相关产品推荐
相关产品推荐

