1

我正在处理我的雷鸟 imap 目录中的一个大 (120mb) 文本文件,并尝试使用 mbox 和正则表达式从标题中提取信息。该过程运行了一段时间,直到我最终得到一个异常:“TypeError:预期的字符串或缓冲区”。

异常引用了这段代码的第五行:

PAT_EMAIL = re.compile(r"[0-9A-Za-z._-]+\@[0-9A-Za-z._-]+")
temp_list = []
mymbox = mbox("data.txt")
for email in mymbox.values():
    from_address = PAT_EMAIL.findall(email["from"]) 
    to_address = PAT_EMAIL.findall(email["to"])
    for item in from_address:
        temp_list.append(item) #items are added to a temporary list where they are sorted then written to file

我已经在其他(较小的)文件上运行了代码,所以我猜问题出在我的文件上。该文件似乎只是一堆文本。有人可以指出我的调试方向吗?

4

2 回答 2

0

只能有一个from地址(我认为!):

在下面的:

from_address = PAT_EMAIL.findall(email["from"]) 

我感觉您正在尝试复制email.message_from_fileemail.utils.parseaddr的工作

from email.utils import parseaddr

>>> s = "Jon Clements <jon@example.com>"
>>> from email.utils import parseaddr
>>> parseaddr(s)
('Jon Clements', 'jon@example.com')

因此,您可以使用parseaddr(email['from'])[1]获取电子邮件地址并使用它。

同样,您可能希望查看email.utils.getaddresses来处理tocc地址...

于 2013-02-26T04:18:19.217 回答
0

好吧,我没有解决这个问题,但为了我自己的目的已经解决了这个问题。我插入了一个 try 语句,以便迭代在任何 TypeError 之后继续。对于每千个电子邮件地址,我会收到大约 8 次失败,这已经足够了。感谢您的输入!

PAT_EMAIL = re.compile(r"[0-9A-Za-z._-]+\@[0-9A-Za-z._-]+")
temp_list = []
mymbox = mbox("data.txt")
for email in mymbox.values():
    try:
        from_address = PAT_EMAIL.findall(email["from"])
    except(TypeError):
        print "TypeError!"
    try:
        to_address = PAT_EMAIL.findall(email["to"])
    except(TypeError):
        print "TypeError!"
    for item in from_address:
        temp_list.append(item) #items are added to a temporary list where they are sorted then written to file
于 2013-02-27T00:00:21.700 回答