处理文本文件时,Python期望字符串或缓冲区

1 投票
2 回答
774 浏览
提问于 2025-04-17 17:08

我正在处理一个很大的文本文件(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_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 地址……

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

撰写回答