用Python解析mbox文件
这里是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
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:
不匹配。