Python+SQLite统计邮箱域名邮件数:代码结果与预期不符求助
问题排查与修正
你的代码存在三个核心问题,导致统计结果不符合预期:
1. 错误匹配非目标行
line.startswith('From')会同时匹配两种行:
- 目标发件记录行:
From someone@example.com ... - 非目标邮件头行:
From: someone@example.com
后者不属于需要统计的发件人数据,必须过滤。应改为匹配带空格的From:
if not line.startswith('From '): continue
2. 统计对象错误
需求是统计邮箱域名(@后的部分),但你的代码把完整邮箱地址作为org存入数据库。所有数据库操作的参数都要替换成拆分后的domaine变量:
- 查询:
cur.execute('SELECT count FROM Counts WHERE org = ?', (domaine,)) - 插入:
cur.execute('INSERT INTO Counts (org, count) VALUES (?, 1)', (domaine,)) - 更新:
cur.execute('UPDATE Counts SET count=count+1 WHERE org=?', (domaine,))
3. SQL插入语句语法错误
插入语句中的反引号和多余空格是无效语法,需清理:
原错误语句:
cur.execute('INSERT INTO Counts `(`org, count`) `VALUES (?,1)',(email,))
修正后:
cur.execute('INSERT INTO Counts (org, count) VALUES (?, 1)', (domaine,))
修正后的完整代码
import sqlite3 conn = sqlite3.connect('data2.sqlite') cur = conn.cursor() cur.execute('DROP TABLE IF EXISTS Counts') cur.execute('CREATE TABLE Counts (org TEXT, count INTEGER)') for line in open('mbox.txt'): if not line.startswith('From '): continue line_parts = line.split() email = line_parts[1] domaine = email.split('@')[1] cur.execute('SELECT count FROM Counts WHERE org = ?', (domaine,)) row = cur.fetchone() if not row: cur.execute('INSERT INTO Counts (org, count) VALUES (?, 1)', (domaine,)) else: cur.execute('UPDATE Counts SET count=count+1 WHERE org=?', (domaine,)) # 循环结束后统一提交,提升效率 conn.commit() cur.close() conn.close()
运行修正后的代码,就能得到最高组织计数为536的正确结果。
内容的提问来源于stack exchange,提问作者omar
相关产品推荐
相关产品推荐

