我正在尝试从电子邮件日志中提取数据的项目。基本上我想清理一个大的.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())
我的想法已经不多了。我不确定创建所有这些单独的文件是最好的方式(有成千上万的电子邮件......)
答案 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))