簡體   English   中英

在python中解析文件以首先找到一個字符串,然后解析以下字符串,直到找到另一個字符串

[英]Parse a file in python to find first a string, then parse the following strings until it find another string

我試圖滾動通過我們的過程之一打印結果文件。

目的是瀏覽各種塊並找到特定的參數。 我試圖解決這個問題,但是找不到一種避免多次分析文件的有效方法。

這是我閱讀的輸出文件的示例:

ID:13123
Compound:xyz
... various parameters
RhPhase:abc

ID:543
Compound:lbm
... various parameters

ID:232355
Compound:dfs
... various parameters
RhPhase:cvb

我正在尋找具有RhPhase的特定ID,但是由於文件包含更多條目,因此我只想要該特定ID。 它可能有也可能沒有RhPhase; 如果有一個,我就會得到價值。

我發現的唯一方法是實際遍歷整個文件(可能是數百個塊,以了解大小),並為每個具有RhPhase的ID列出一個清單,然后在第二個實例中,我滾動瀏覽字典,檢索特定ID的值。

這感覺效率很低。 我嘗試做一些不同的事情,但是在滾動時卻陷入了困境。 所以我可以告訴python讀取每一行->當找到我想要繼續讀取的ID時->如果您發現RhPhase獲取該值,否則停在下一個ID處。

我被困在這里:

datafile=open("datafile.txt", "r")
for items in datafile.readline():
    if "ID:543" in items:
        [read more lines]
        [if "RhPhase" in lines:]
        [    rhphase=lines     ]
        [elif ""ID:" in lines  ]
        [    rhphase=None      ]
        [    break             ]

找到ID后; 我不知道如何繼續尋找RhPhase字符串或找到第一個ID:string並停止所有操作(因為這意味着該ID沒有關聯的RhPhase)。

這將通過文件一次,並只檢查特定的ID,而不是一次分析整個內容,然后進行第二次傳遞。 可能這樣做,還是我堅持雙重解析?

通常,您可以使用一個簡單的狀態機解決這類問題:讀取各行,直到找到您的ID; 然后將閱讀器置於特殊狀態,然后檢查要提取的參數。 在您的情況下,您只有兩種狀態:未找到ID和已找到ID,因此一個簡單的布爾值就足夠了:

foundId = False
with open('datafile.txt', 'r') as datafile:
    for line in datafile:
        if foundId:
            if line.startswith('RhPhase'):
                print('Found RhPhase for ID 543:')
                print(line)

                # end reading the file
                break
            elif line.startswith('ID:'):
                print('Error: Found another ID without finding RhPhase first')
                break

        # if we haven’t found the ID yet, keep looking for it
        elif line.startswith('ID:543'):
                foundId = True

暫無
暫無

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

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