Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python解析mbox文件_Python_Email_Mbox - Fatal编程技术网

用Python解析mbox文件

用Python解析mbox文件,python,email,mbox,Python,Email,Mbox,这里是Python新手。我想浏览一个大的mbox文件,解析电子邮件。我可以这样做: import sys import mailbox def gen_summary(filename): mbox = mailbox.mbox(filename) for message in mbox: subj = message['subject'] print subj if __name__ == "__main__": if len(sys.a

这里是Python新手。我想浏览一个大的mbox文件,解析电子邮件。我可以这样做:

import sys
import mailbox

def gen_summary(filename):
    mbox = mailbox.mbox(filename)
    for message in mbox:
       subj = message['subject']
       print subj

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print 'Usage: python genarchivesum.py mbox'
        sys.exit(1)

    gen_summary(sys.argv[1])
但我需要更多的控制。我需要能够获得mbox文件中给定电子邮件开头的字节位置,还需要获得消息中的字节数(如磁盘上所示)。然后在将来,我不需要从mbox文件的开头进行迭代,而是需要能够找到给定的消息并解析它(因此需要获取磁盘上的字节位置)。这些是大的mbox文件,效率是一个问题


所有这些的目的是,我可以生成一个摘要文件,其中包含有关mbox中每个电子邮件的一些小信息,然后在将来有效地在mbox中查找各个电子邮件。

我没有测试过这一点,但类似的东西可能适合您。只需打开文件(以二进制模式,以便字节计数正确),然后扫描文件,查找消息

def is_mail_start(line):
    return line.startswith("From ")

def build_index(fname):
    with open(fname, "rb") as f:
        i = 0
        b = 0
        # find start of first message
        for line in f:
            b += len(line)
            if is_mail_start(line):
                break
        # find start of each message, and yield up (index, length) of previous message
        for line in f:
            if is_mail_start(line):
                yield (i, b)
                i += b
                b = 0
            b += len(line)
        yield (i, b) # yield up (index, length) of last message

# get index as a list
mbox_index = list(build_index(fname))

一旦有了索引,就可以对文件对象使用
.seek()
方法在那里进行搜索,对文件对象使用
.read(length)
方法只读取一条消息。不过,我不确定您将如何使用带有字符串的
邮箱
模块;我认为这是为了在适当的地方处理邮箱。也许你还可以使用其他邮件解析模块。

我从未使用过
邮箱
,但我只是阅读了
帮助(mailbox.mbox)
。您不能使用
.iterkeys()
方法获取键值的迭代器,然后使用键值查找消息吗?为什么要使用字节索引作为键来查找消息,而不是使用模块。。。您是否尝试过使用模块按键索引邮件?如果你试过了,但是速度太慢或者其他什么的,请说出来。比如说我收到了10000封mbox邮件。当我只想要最后一封电子邮件时,我不想阅读/解析/迭代9998封邮件。我想在mbox文件中找到这一点,然后读一下这条消息。@MarkFletcher,这条消息起作用了吗?如果是,请告诉我。好的,谢谢。我想我会用这种策略。顺便说一句,mbox中电子邮件的开头以“From”(不带:)开头。我可以使用email.Parser来解析电子邮件。谢谢。我会编辑答案,去掉“:”。我说过我没有测试它。。。祝你的项目好运,周末愉快!不管它值多少钱,对于未来的用户来说,它实际上是两者兼而有之,至少在最新版本的OSX上是如此。def is_mail_start(line):返回line.startswith(“From”)而不是line.startswith(“From”)。如果标记开始的
From
后面总是跟一个空格,您可以只搜索字符串
“From”
(注意末尾的空格)。这与带有冒号的
From:
不匹配。