1

Thunderbird imap ディレクトリから大きな (120 MB) テキスト ファイルを処理しており、mbox と正規表現を使用してヘッダーから情報を抽出しようとしています。最終的に例外が発生するまで、プロセスはしばらく実行されます:「TypeError:文字列またはバッファが必要です」。

例外は、次のコードの 5 行目を参照しています。

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

アドレスは1つだけ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.getaddressestoを調べて、アドレスを処理することもできccます...

于 2013-02-26T04:18:19.217 に答える
0

まあ、私は問題を解決しませんでしたが、私自身の目的のためにそれを回避しました。TypeError を過ぎても繰り返しが続くように、try ステートメントを挿入しました。1,000 件のメール アドレスごとに約 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 に答える