You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:05:28