2013-02-26 49 views
1

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

异常引用该代码的第五行:

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 

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

+1

在失败的迭代中检查'type(email [“from”])'''。 – 2013-02-26 03:51:08

+0

你可以发布你的'findall'方法的代码吗? – eazar001 2013-02-26 04:12:46

+0

增加了findall方法来发布。 – spatialaustin 2013-02-26 05:46:03

回答

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 
+0

能够以这种方式跳过故障是可以的,如果这符合您的需求。你当然可以(虽然我冒着说明这里非常明显的风险)使用除了部分打印出'电子邮件',并找出是什么导致失败,以便你可以完全避免这些错误。 – 2013-03-08 11:00:04

0

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

在下面:

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

我有一种感觉,你想复制的email.message_from_file和工作email.utils.parseaddr

from email.utils import parseaddr 

>>> s = "Jon Clements <[email protected]>" 
>>> from email.utils import parseaddr 
>>> parseaddr(s) 
('Jon Clements', '[email protected]') 

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

同样,你不妨看看email.utils.getaddresses处理tocc地址...

相关问题