首页 > 解决方案 > 计数组织(数据库 sqlite3)

问题描述

我需要有关此 python 代码的帮助。我正在制作一个应用程序,它将读取邮箱数据 (mbox.txt) 并使用具有以下架构的数据库来计算每个组织的电子邮件数量(即电子邮件地址的域名)以维护计数。最高组织计数为 536

这是架构:CREATE TABLE Counts (org TEXT, count INTEGER)

我已经尝试了很多次,我就是无法得到 536 的计数。下面是我的代码:

import sqlite3

conn = sqlite3.connect('emaildb.sqlite')
cur = conn.cursor()

cur.execute('DROP TABLE IF EXISTS Counts')

cur.execute('''
CREATE TABLE Counts (org TEXT, count INTEGER)''')

fname = input('Enter file name: ')
if (len(fname) < 1): fname = 'mbox.txt'

fh = open(name)
for line in fh:
    if not line.startswith('From: '): continue
    pieces = line.split()
    org = pieces[1]
    cur.execute('SELECT count FROM Counts WHERE org = ? ', (org,))
    row = cur.fetchone()
    if row is None:
       cur.execute('''INSERT INTO Counts (org, count)
              VALUES (?, 1)''', (org,))
    else:
       cur.execute('UPDATE Counts SET count = count + 1 WHERE org = ?',
                    (org,))
conn.commit()

# https://www.sqlite.org/lang_select.html
sqlstr = 'SELECT org, count FROM Counts ORDER BY count DESC LIMIT 10'

for row in cur.execute(sqlstr):
    print(str(row[0]), row[1])

cur.close()

我得到的最高数字是 195。这是上面代码的输出:

Enter the file name: 
zqian@umich.edu 195 
mmmay@indiana.edu 161
cwen@iupui.edu 158
chmaurer@iupui.edu 111
aaronz@vt.edu 110
ian@caret.cam.ac.uk 96
jimeng@umich.edu 93
rjlowe@iupui.edu 90
dlhaines@umich.edu 84
david.horwitz@uct.ac.za 67

这是我获取文本文件并将其写入名为 mbox.txt 的文本文件的链接(https://www.py4e.com/code3/mbox.txt

标签: pythonsqlite

解决方案


您没有从电子邮件中提取域。因此,同一域中的多封电子邮件被视为不同的组织。

for line in fh:
    if not line.startswith('From: '): continue
    pieces = line.split()
    email = pieces[1]
    pieces = email.splot('@')
    org = pieces[1]
    ...

此外,您可能希望使用SQLite INSERT - ON DUPLICATE KEY UPDATE (UPSERT)中的代码,这样您就不必SELECT查询该组织是否已经存在。


推荐阅读