16

Python初心者はこちら。大きなmboxファイルを調べて、電子メールメッセージを解析したいと思います。私はそれを行うことができます:

import sys
import mailbox

def gen_summary(filename):
    mbox = mailbox.mbox(filename)
    for message in mbox:
       subj = message['subject']
       print subj

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print 'Usage: python genarchivesum.py mbox'
        sys.exit(1)

    gen_summary(sys.argv[1])

しかし、もっと制御する必要があります。mboxファイルで特定の電子メールの先頭のバイト位置を取得できる必要があります。また、メッセージのバイト数(ディスクに表示されている)も取得する必要があります。そして将来的には、mboxファイルの先頭から繰り返すのではなく、特定のメッセージを探してそれを解析できるようにする必要があります(したがって、ディスク上のバイト位置を取得する必要があります)。これらは大きなmboxファイルであり、効率が問題になります。

このすべての目的は、mbox内の各電子メールに関するいくつかの小さなビットを含む要約ファイルを生成し、将来的にmbox内の個々の電子メールを効率的に検索できるようにすることです。

4

1 に答える 1

9

私はこれをテストしていませんが、このようなものがあなたのために働くかもしれません。ファイルを開いて(バイナリモードでバイトカウントが正しいように)、ファイルをスキャンしてメッセージを見つけます。

def is_mail_start(line):
    return line.startswith("From ")

def build_index(fname):
    with open(fname, "rb") as f:
        i = 0
        b = 0
        # find start of first message
        for line in f:
            b += len(line)
            if is_mail_start(line):
                break
        # find start of each message, and yield up (index, length) of previous message
        for line in f:
            if is_mail_start(line):
                yield (i, b)
                i += b
                b = 0
            b += len(line)
        yield (i, b) # yield up (index, length) of last message

# get index as a list
mbox_index = list(build_index(fname))

インデックスを取得したら.seek()、ファイルオブジェクトでメソッドを使用してそこを.read(length)検索し、ファイルオブジェクトで1つのメッセージのみを読み取ることができます。mailboxただし、文字列でモジュールをどのように使用するかはわかりません。私はそれがその場でメールボックスで働くことを意図していると思います。たぶん、あなたが使用できる他のいくつかのメール解析モジュールがあります。

于 2012-04-20T20:01:46.370 に答える