如何隔离包含特定单词的文本块并删除其他单词?

时间:2014-11-11 16:39:08

标签: python python-2.7

我正在尝试从电子邮件日志中提取数据的项目。基本上我想清理一个大的.txt文件的无关电子邮件,然后计算每个相关电子邮件中的特定数据。

可以通过电子邮件正文中的 JACKPOT WORD 来识别相关的电子邮件。但我真的想要获得每封电子邮件独有的重要信息

JACKPOT WORD 重要信息将位于每封电子邮件的不同行/位置。

我有问题从文件中删除不相关的电子邮件。

我设法将每封电子邮件与页眉和页脚分开,但我对如何删除不相关的电子邮件感到茫然。

这就是文件现在的样子:

--- new email ---
irrelevant email that spans over multiple lines
blablablablablablablablablablablablablablablabla
blablablablablablablablablablabla**looks like important info**blablablablabla
--- end email ---

--- new email ---
**relevant** email that spans over multiple lines
blablablablablablablab**JACKPOT WORD**lablablablablablablablabla
blablablablablablablablablablablablabla**important info**blablabla
--- end email ---

--- new email ---
irrelevant email that spans over multiple lines
blablablablablablablablablabl**looks like important info**ablablablablablabla
blablablablablablablablablablablablablablablabla
--- end email ---

--- new email ---
**relevant** email that spans over multiple lines
blablablablablablablab**JACKPOT WORD**lablablablablablablablabla
blablablablablablablablablablablablabla**important info**blablabla
--- end email ---

我想要的结果是:

--- new email ---
**relevant** email that spans over multiple lines
blablablablablablablab**JACKPOT WORD**lablablablablablablablabla
blablablablablablablablablablablablabla**important info**blablabla
--- end email ---

--- new email ---
**relevant** email that spans over multiple lines
blablablablablablablab**JACKPOT WORD**lablablablablablablablabla
blablablablablablablablablablablablabla**important info**blablabla
--- end email ---

我首先尝试使用.find( JACKPOT WORD ),但我只会获得单独的行,这些通常不包含重要信息,我是寻找(通常在电子邮件中的另一行)。

我尝试使用以下方法将每封电子邮件拆分成文件(

splittxt = '--- new email ---'
endtxt = '--- end email ---'

fread = open("outputfile.txt")
count = 1
fwrite = open("email%s.txt" % (count), 'w')
for line in fread:
    if line.startswith(splittxt):
        fwrite.close()
        count += 1
        fwrite = open("email%s.txt" % (count), 'w')
        fwrite.write(line + "\n")
    else:
        fwrite.write(line + "\n")
fwrite.close()
fread.close()

这会为每个单独的电子邮件创建一个名为email1.txt,email2.txt,email3.txt等的.txt文件的长列表。

我不知道如何阅读这些文件并仅将包含 JACKPOT WORD 的电子邮件写入新文件。

我尝试了以下操作,它运行但返回一个空的result.txt文件。

count = 1
keeptxt = '**JACKPOT WORD**'

for i in range(1000):       
    fread = open("email%s.txt" % (count)).readlines()
    with open('result.txt', 'w') as outfile:
        for line in fread:
            if keeptxt in line:
                with open(fread) as infile:
                    outfile.write(infile.read())

我的想法已经不多了。我不确定创建所有这些单独的文件是最好的方式(有成千上万的电子邮件......)

2 个答案:

答案 0 :(得分:0)

是的,当然每封电子邮件创建一个文件会毫无理由地占用大量空间,但是,嘿,你必须从你的小提琴开始。

将您所拥有的代码中的内容拼凑在一起,这应创建一个仅包含包含累积奖金字词的电子邮件的文件。

splittxt = '--- new email ---\n'
keeptxt = '**JACKPOT WORD**'

fread = open("outputfile.txt")
fwrite = open("jackpotEmails.txt", 'w')

thisEmail = ""
hasJackpot = False
for line in fread:
    if line.startswith(splittxt):
        # if the previous email had the jackpot word, then write out that email
        if hasJackpot :
            fwrite.write(thisEmail)

        # new email
        thisEmail = splittxt

    if not hasJackpot:
        hasJackpot = keeptxt in line

    thisEmail += line

fwrite.close()
fread.close()

是否将所有相关的电子邮件提取到您想要做的文件中,或者您是否还要自动提取重要信息位?这似乎更难,我们需要更多关于重要信息位中的内容的信息。

(你的最后一个例子不起作用,因为当你从磁盘读取文件时,它们有一个像MS Word一样的光标,当你读取它时会在文件中移动;当你执行file.readlines()整个文件时一次读取并且光标一直移动到结尾,然后当你执行file.read()之后,由于光标已经在结尾,所以没有什么可读的。通常当人们使用文件时。 readlines()然后他们关闭文件,只对那个巨型字符串起作用。)

最后评论:如果您将来要进行更多的文本分析,我建议花些时间研究一下自然语言Tookkit http://www.nltk.org/,它是python的一个巨大的文本处理工具。花一些时间阅读教程会给你一个想法1)存在哪些工具2)人们处理文本分析问题的标准方法。

答案 1 :(得分:0)

在收集了您感兴趣的所有信息之前,无需编写任何其他文件。只需将所有内容放入临时列表,然后写出结果:

# gather all the relevant data first...
NEW_EMAIL = '--- new email ---'
END_EMAIL = '--- end email ---'
JACKPOT = '**JACKPOT WORD**'

email = []
jackpots = []
starting = True
with open('input.txt') as stream:
    for line in stream:
        if starting:
            if line.startswith(NEW_EMAIL):
                # start gathering new email lines
                email = []
                starting = False
        elif line.startswith(END_EMAIL):
            # start looking for a new email
            starting = True
        else:
            email.append(line)
            if JACKPOT in line:
                # only keep jackpot emails
                jackpots.append(email)

# now write out the final file...
with open('output.txt', 'w') as stream:
    for email in jackpots:
        stream.write('%s\n%s%s\n\n' % (
            NEW_EMAIL, ''.join(email), END_EMAIL))