如果'短语'在csv列中,用Python写一个新行,表示true / false

时间:2016-03-17 20:55:08

标签: python csv

我正在尝试整理一些电子邮件。发送了一封特定的电子邮件,我想知道是谁回复了。我已经制定了两个csv文件,一个包含电子邮件请求,另一个包含电子邮件回复,两个都有标题;主题,收件人,来自,日期。

不幸的是,电子邮件回复了来自&#39;来自&#39;格式为(Joe Bloggs <joebloggs@gmail.com>),而电子邮件请求&#39; To&#39;格式为(joebloggs@gmail.com)。所以我不能直接将它们联系起来,因为它们不相同所以我需要搜索字符串(电子邮件地址)

这是我目前的代码

import csv

req=open('DESmailrequests.csv', 'rb')
requests=csv.reader(req)
rep=open('Desmailreplies.csv', 'rb')
replies=csv.reader(rep)

comparison = open('DESmailrequests.csv', 'wb')
writer = csv.writer(comparison)

for row in replies:
    replies_2=row[2]
replies_2 = set(replies_2)

碰撞一下。基本上我希望能够说,如果来自回复[2]中的请求[1]的string/phrase,请在请求中写下新行,并回复&#39; /&#39;不回复&#39;

for row in requests:
    if row[1] in replies_2:
        writer.writerow(row[3])

req.close()
rep.close()
comparison.close()

到目前为止,这还没有工作,我只是得到一个空白的csv。我很感激任何可能的帮助。

到目前为止,使用Python对这些~100,000封电子邮件进行排序是一个绝对的爆炸而且相对简单!刚刚碰到最后一道障碍。

2 个答案:

答案 0 :(得分:0)

错误在:

comparison = open('DESmailrequests.csv', 'wb')

执行此操作时,您将创建一个新的“DESmailrequests.csv”文件。 csv阅读器正在读取一个空文件,所以:

for row in requests:

导致什么都不做。

您应该以“追加”模式打开文件:

comparison = open('DESmailrequests.csv', 'ab')

答案 1 :(得分:0)

我在您的代码中看到了一些问题。第一个,以及您获取空文件的原因是:

comparison = open('DESmailrequests.csv', 'wb')

您正在删除自己的文件。你为什么不打开新文件?用另一个名字?

其次,您自己说过,From列表无法与回复列表进行比较。所以你试图错误地将字符串与列表进行比较。

In [5]: senders = {"Joe Bloggs <joebloggs@gmail.com>", "Foo Bar <foo.bar@example.com>"} 

In [6]: senders
Out[6]: {'Foo Bar <foo.bar@example.com>', 'Joe Bloggs <joebloggs@gmail.com>'}

In [7]: "Foo Bar" in senders
Out[7]: False

请注意,这不会起作用:

In [15]: "<foo.bar@example.com>" in {"Joe Bloggs <joebloggs@gmail.com>", "Foo Bar <foo.bar@example.com>"}
Out[15]: False

在进行比较之前,您需要使用一些正则表达式或python逻辑清理sendres列表:

In [8]: def extract_mail(str):
   ...:     return str[str.index('<'):str.index('>')+1]
   ...: 

In [9]: map(extract_mail, senders)
Out[9]: ['<joebloggs@gmail.com>', '<foo.bar@example.com>']

现在你可以做比较了。

以下是以比较方式提取电子邮件的正确方法:

In [18]: def extract_mail(str):                                                                  
    return str [str.index('<')+1:str.index('>')]
   ....: 

In [19]: map(extract_mail, {"Joe Bloggs <joebloggs@gmail.com>", "Foo Bar <foo.bar@example.com>"})
Out[19]: ['joebloggs@gmail.com', 'foo.bar@example.com']

所以现在你的搜索工作:

In [20]: "joebloggs@gmail.com" in ['joebloggs@gmail.com', 'foo.bar@example.com']
Out[20]: True
相关问题