处理文本文件时,Python期望字符串或缓冲区
我正在处理一个很大的文本文件(120MB),这个文件来自我的Thunderbird IMAP目录。我想用mbox和正则表达式提取一些头部信息,比如发件人和收件人。这个过程运行了一段时间,最后我遇到了一个错误:“TypeError: expected string or buffer”。
这个错误提到了我代码的第五行:
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
我在其他(较小的)文件上运行过这段代码,所以我猜问题出在我的这个大文件上。这个文件看起来只是一些文本。有人能帮我指点一下该如何调试这个问题吗?
2 个回答
0
只能有一个 from
地址(我觉得是这样!):
在下面的代码中:
from_address = PAT_EMAIL.findall(email["from"])
我感觉你可能是在重复 email.message_from_file 和 email.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,来处理 to
和 cc
地址……
0
嗯,我没有解决这个问题,但我找到了一个适合我自己用的方法。我加了一个“尝试”语句,这样在遇到类型错误的时候,程序就会继续往下执行。每一千个邮箱地址中大约有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