簡體   English   中英

Python文本解析 - 如何捕獲和寫入多行

[英]Python text parsing - how to capture and write multiple lines

我正在嘗試使用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行寫一個寫入語句? 對我來說,這似乎是同一類型的多線和/或相對線參考問題。

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) ; 當你找到一個消息底部(在將它送入雙端隊列之前)時,雙端隊列包含你想要的線條。

您可以將文件讀入數組,然后使用從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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM