1

2 つの長いリストがあります。1 つは次のような形式の行を含むログ ファイルからのものです。

201001050843 blah blah blah <email@site.com> blah blah

もう 1 つのファイルは csv 形式です。csv 形式を維持しながら、ログ ファイルに電子メール アドレスが含まれていない file2 のすべてのエントリのリストを生成する必要があります。


ログ ファイルの例:

201001050843 blah blah blah <email@site.com> blah blah
201001050843 blah blah blah <email2@site.com> blah blah

File2 には以下が含まれます。

156456,bob,sagget,email@site.com,4564456
156464,bob,otherguy,email@anothersite.com,45644562

出力は次のようになります。

156464,bob,otherguy,email@anothersite.com,45644562

現在、ログからメールを取得し、次のように別のリストにロードします。

sent_emails =[]
for line in sent:
    try:
        temp1= line.index('<')
        temp2 = line.index('>')
        sent_emails.append(line[temp1+1:temp2])
    except ValueError:
        pass

そして、次のいずれかで file2 と比較します。

lista = mail_lista.readlines()
for line in lista:
    temp = line.split()
    for thing in temp:
        try:
            if thing.index('@'):
                if thing in sent_emails:
                    lista.remove(temp)
        except ValueError:
            pass
newa.writelines(lista)

また:

for line in mail_listb:
    temp = line.split()
    for thing in temp:
        try:
            if thing.index('@'):
                if thing not in sent_emails:
                    newb.write(line)
        except ValueError:
            pass

ただし、どちらもfile2のすべてを返します!

ご協力いただきありがとうございます。

編集:セットの推奨事項に感謝します。私が考えていたよりも大きな速度差がありました. さすがハッシュテーブル!私は間違いなくこれからもっと頻繁にセットを使用します.

4

3 に答える 3

1

一連の電子メールを作成してから、次のことを行うことができます。

# emails is a set of emails
for line in fileinput.input("csvfile.csv",inplace =1):
    parts = line.split(',')
    if parts[3] not in emails:
        print line

これは、CSV ファイル内の電子メールが常に 4 番目の位置にある場合にのみ機能します。

fileinputはインプレース編集を有効にします。

そして、アーロンが言ったように、リストの代わりにメールのセットを使用してください。これは、速度のためだけでなく、重複を排除するためでもあります。

于 2010-01-05T17:31:37.140 に答える
1

line.split()空白で分割します。line.split(',')代わりに使用してください。

また、行の順序は重要ですか? そうでない場合は、実際set()にはリストの代わりに a を使用する必要があります。これにより、コードがはるかに高速になります。

于 2010-01-05T17:23:04.973 に答える
0

別の方法として、メールアドレスの位置を最小限にチェックする方法があります。

import fileinput
emails=[]
for line in open("file1"):
    start=line.find("<")
    end=line.find(">")
    if start != -1 and end !=-1:
        emails.append(line[start+1:end])

for line in fileinput.FileInput("file2",inplace=1):
    p = line.split(",")
    for item in p:
        if "@" in item and item not in emails:
            print line.strip()

出力

$ ./python.py
156464,bob,otherguy,email@anothersite.com,45644562
于 2010-01-06T00:39:23.043 に答える