Python文本解析-如何捕获和写入多行

Python文本解析-如何捕获和写入多行,python,parsing,Python,Parsing,我试图使用Python从@6500表单生成的电子邮件中提取特定的四个数据元素:主题字段、发件人的电子邮件地址、日期戳和发件人的物理地址 我编写了一个简单的Python脚本,它成功地从每条消息中复制前三个数据元素,并将它们写入一个新文件。这很容易做到,因为对于这三个数据元素中的每一个,每个元素都有一个明确的标记(“Subject”、“From”或“Date”)。下面是我的Python脚本,它成功地捕获了前三个数据元素: with open("samplefile.txt") as f: w

我试图使用Python从@6500表单生成的电子邮件中提取特定的四个数据元素:主题字段、发件人的电子邮件地址、日期戳和发件人的物理地址

我编写了一个简单的Python脚本,它成功地从每条消息中复制前三个数据元素,并将它们写入一个新文件。这很容易做到,因为对于这三个数据元素中的每一个,每个元素都有一个明确的标记(“Subject”、“From”或“Date”)。下面是我的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)
我要捕获的第四个数据元素,发送者的物理地址,处理方式不同。由于这些电子邮件的网络形式性质,发件人的姓名和家庭地址在每条邮件中始终位于同一位置。在以“日期:”开头的一行之后,有一个空行,然后发件人的真实姓名总是在下一行,发件人的家庭地址总是在下一行,然后发件人的城市和邮政编码总是在下一行

我的问题是:我可以向上面的代码添加什么,这样它不仅可以将“日期:”行写入输出文件,还可以将“日期:”行之后的第2、3和4行写入输出文件?我一直找不到任何关于如何处理多行或相对行引用的信息

二是相关问题。我已经开始收到第二批形式的电子邮件。在第二批邮件中,发件人的姓名和地址位于每条邮件的底部。浏览并找到每条消息的开头很容易。如何为每条消息底部的第1行、第2行、第3行和第4行编写语句?对我来说,这似乎是同一类型的多行和/或相对行参考问题

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)
;当您找到消息的底部时(在将其馈送到deque之前),deque正好包含您想要的行。

您可以将文件读入数组,然后使用从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])
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])
对于文件的最后4行:

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])
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])

这很有效。我将完善脚本(插入新行等),一旦我得到最终的mbox文件。但这(最后!)向我展示了如何进行相对行引用。这是我第一次在网上发布问题,在我花了好几个小时寻找答案后,你终于找到了答案。谢谢。这正是我想要做的。我还没有尝试文件结束的建议,但当我得到最终的mbox文件,我将与我的工作,我会给它一个机会。谢谢你让我的第一次问答这么快就成功了。