使用Python和Sqlite计算组织

时间:2015-12-27 15:31:15

标签: python sqlite

此应用程序将读取邮箱数据(mbox.txt),使用具有以下架构的数据库计算每个组织的电子邮件数量(即电子邮件地址的域名),以维持计数。

CREATE TABLE Counts (org TEXT, count INTEGER)

在mbox.txt上运行程序后,将上面生成的数据库文件上传以进行评分。 如果您在测试中多次运行程序或使用不同的文件,请确保在每次运行之前清空数据。

您可以将此代码用作应用程序的起点:http://www.pythonlearn.com/code/emaildb.py。此应用程序的数据文件与先前的分配相同:http://www.pythonlearn.com/code/mbox.txt

第一次学习Sqlite。我对这项任务感到非常困惑,尽管看起来很容易。我不知道如何将Python代码连接到Sqlite。他们似乎不需要将代码作为任务。所有需要都是数据库文件。我该如何解决这个问题。不知道如何启动它。非常感谢!

4 个答案:

答案 0 :(得分:2)

您已经获得的起始代码是您想要做的非常好的模板。不同之处在于 - 在该示例中 - 您正在计算电子邮件地址的出现次数,并且在此问题中您将计算域名。

首先要考虑如何从电子邮件地址获取域名。根据给定的代码构建(设置email = pieces [1]):

domain = email.split('@')[1]

这将打破@字符上的电子邮件,并返回第二个项目(' @'之后的部分),即域名 - 您想要计算的内容。

在此之后,浏览代码中的SQL语句并替换“电子邮件”#39;使用'域名',以便您计算正确的事情。

最后一件事 - 模板代码检查' mbox-short.txt' - 您还需要编辑所需的文件。

答案 1 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    char *s = "foo bar";
    char *a = malloc(sizeof *a * (strlen(s) + 1));
    strcpy(a, s);

    puts(a);

    size_t rest = strlen(a);

    /* Don't do anything if a is an empty string */
    if (rest) {
        memmove(a, a+1, rest);

        /* If you must reallocate */
        char *temp = realloc(a, rest);
        if (temp) {
            a = temp;
        }
    }

    puts(a);

    free(a);

    return 0;
}

答案 2 :(得分:0)

我还是新来的,但我要感谢Stidgeon指出我正确的方向。我怀疑其他使用Python数据库的学生也会在这里结束。

您需要对源代码执行两项操作。

  1. domain = email.split('@')[1] http://www.pythonlearn.com/code/emaildb.py
  2. 生成数据库时,从电子邮件TEXT更改为org TEXT。
  3. 这应该可以帮助你。

答案 3 :(得分:0)

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-short.txt'
fh = open(fname)
for line in fh:
    if not line.startswith('From: '): continue
    pieces = line.split()
    org = pieces[1].split('@')
    cur.execute('SELECT count FROM Counts WHERE org = ? ', (org[1],))
    row = cur.fetchone()
    if row is None:
        cur.execute('''INSERT INTO Counts (org, count)
                VALUES (?, 1)''', (org[1],))
    else:
        cur.execute('UPDATE Counts SET count = count + 1 WHERE org = ?',
                    (org[1],))
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()
print('-----------------done----------------')