我正在尝试使用Python从@ 6,500表单生成的电子邮件中提取某些四个数据元素:主题字段,发件人的电子邮件地址,日期戳和发件人的实际地址。
我编写了一个简单的Python脚本,可以成功复制每条消息中的前三个数据元素并将它们写入新文件。这很容易实现,因为对于这三个数据元素中的每一个,每个元素都有一个明确的标记(“主题”,“从”或“日期”)。这是我的Python脚本,它成功地抓取了前三个数据元素:
with open("samplefile.txt") as f:
with open("samplefileout.txt", "w") as f1:
for line in f:
line = line.rstrip()
if "Subject: " in line:
f1.write(line)
if "From: " in line:
f1.write(line)
if "Date: " in line:
f1.write(line)
我要捕获的第四个数据元素,即发件人的物理地址,处理方式不同。由于这些电子邮件的网络形式特性,发件人的姓名和家庭地址始终位于每封邮件的相同位置。在以“Date:”开头的行之后有一个空白行,那么发件人的真实姓名总是在下一行,发件人的家庭地址总是在下一行,然后发件人的城市和邮政编码总是在下一行。
我的问题是:我可以在上面的代码中添加什么,这样它不仅可以将“Date:”行写入输出文件,还可以在“Date:”之后写入第2行,第3行和第4行。换行到输出文件?我一直无法找到有关如何处理多行或相对行引用的任何内容。
第二,相关的问题。我已经开始接收看起来像第二批表单电子邮件了。在第二批中,发件人的姓名和地址位于每封邮件的底部。很容易通过并找到每条消息的开头。如何从每条消息的底部为第1行,第2行,第3行和第4行写一个写入语句?对我来说,这似乎是同一类型的多行和/或相对行引用问题。
答案 0 :(得分:0)
with open("samplefile.txt") as inf, open("samplefileout.txt", "w") as outf:
for line in inf:
if line.startswith("Subject: ") or line.startswith("From: "):
outf.write(line)
elif line.startswith("Date: "):
outf.write(line)
skip = next(inf, "") # skip blank line
outf.write(next(inf, "")) # 2
outf.write(next(inf, "")) # 3
outf.write(next(inf, "")) # 4
对于第二个问题,我会考虑将inf
投入collections.deque(maxlen=4)
;当你找到一个消息底部(在将它送入双端队列之前)时,双端队列包含你想要的线条。
答案 1 :(得分:0)
您可以将文件读入数组,然后使用从0到文件长度的整数:
lines = open("test.txt").readlines()
with open("samplefileout.txt", "w") as f1:
for x in range(0,len(lines)):
line = lines[x].rstrip()
if "Subject: " in line:
f1.write(line)
if "From: " in line:
f1.write(line)
if "Date: " in line:
f1.write(line)
f1.write(lines[x+2])
f1.write(lines[x+3])
f1.write(lines[x+4])
对于文件的最后4行:
lines = open("test.txt").readlines()
with open("samplefileout.txt", "w") as f1:
end = len(lines) - 1
f1.write(lines[end-3])
f1.write(lines[end-2])
f1.write(lines[end-1])
f1.write(lines[end])