python - 计数组织(数据库 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)
解决方案
您没有从电子邮件中提取域。因此,同一域中的多封电子邮件被视为不同的组织。
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
查询该组织是否已经存在。
推荐阅读
- reactjs - React Reload 即时消息传递
- javascript - MongoDB在子对象中增加一个变量
- package - 如何从用户定义的包中正确导入宏?
- windows-subsystem-for-linux - Win 10 WSL 不会使用 Ubuntu 将默认版本设置为 2
- java - 在 JAVA 中的自定义异常中将 arrayList 作为消息返回
- javascript - 脚本中的函数未执行 (HTML)
- visual-studio-code - 降价文件中 Git 提交之间的文件差异
- javascript - 如何在带有 launchWebAuthFlow 的 chrome 扩展中使用 oidc-client?
- json - 如何在 JSON 自适应卡中使用 If 语句让团队在提交的选择响应中 @mention 用户?
- three.js - 将 Autodesk forge 与 mapbox 一起使用时的问题